Spring Boot / Controller / 入力パラメータ

Spring Boot / Controller / 入力パラメータ

外部からの入力パラメータをどのようにして受け取るのかという話

このへんはルーティングとも密接に関わってくるのでそちらも参照 Spring Boot/Controller/ルーティング

Controller としては受け付ける形式は関係無く、なんらかの key value の組み合わせとして解釈するので、プログラマがやることはどの名前でどのような形式で受けるかを決めることになる。

単純に Controller の引数として取得する

取得するには RequestParam アノテーションを使う。name に対して受け付けたいキーの名前を設定する。

@RestController
@RequestMapping("/hoge")
public class HogeRestController {
    @RequestMapping("/param1")
    public String param1(@RequestParam(name="a1") String p1) {
        return p1;
    }
}

複数なら複数書けばいい

@RestController
@RequestMapping("/hoge")
public class HogeRestController {
    @RequestMapping("/param2")
    public String param2(@RequestParam(name="a1") String p1, @RequestParam(name="a2") String p2) {
        return p1 + p2;
    }
}

同一キーで複数値を送るやつがある。

書き方はそのままに List で受けるようにすると受けてくれる。

@RestController
@RequestMapping("/hoge")
public class HogeRestController {
    @RequestMapping("/param3")
    public String param3(@RequestParam(name="a1") List<String> p1) {
        return p1.toString();
    }
}

ちなみにフレームワークにありがちな、配列風に書くと受け取れるは通用しない

http://localhost:8080/hoge/param3?a1[0]=aabb&a1[1]=ccdd

Form インスタンスにマッピングする

有りげな、外部からくるパラメータをひとまとめにしたFormクラスを作っておいてそいつで全部一発で受けるという方法

ModelAttribute アノテーションを使ってそのクラスを指定する。 Form クラスは流用性が低いので内部クラスで実装してもよいだろう

http://localhost:8080/hoge/param4?a1=abc&a2=def

@RestController
@RequestMapping("/hoge")
public class HogeRestController {
    @RequestMapping("/param4")
    public String param4(@ModelAttribute Param4Form p1) {
        return p1.getAll();
    }
 
    public class Param4Form{
        private String a1;
        private String a2;
 
        public void setA1(String a1) {
            this.a1 = a1;
        }
        public void setA2(String a2) {
            this.a2 = a2;
        }
        public String getAll() {
            return this.a1 + this.a2;
        }
    }
}

これのヨイところは、明示的にキーを書かなくても setter と一致するならばそれが自動的にセットされるというところだ。 つまり setA2 メソッドを実装しておけば、自動的に a2 キーの値がそこにセットされるということになる。

REST的に URL の一部から取る

RequestMapping にパラメータとなる部分に中括弧付きで名前をつけておく。 そしてメソッドの引数に同じ名前の変数を作ってそれに、PathVariable アノテーションをつける

@Controller
@RequestMapping("/hoges")
public class HogesController {
    @RequestMapping("/{id}")
    public String piyo(@PathVariable String id, Model model) {
        model.addAttribute("id", id);
        return "hoges/piyo";
    }
}

このようにすると

http://localhost/hoges/12345

でパラメータが取れる。

RequestMapping 記述と Form の中の setter と名前を一致させても取ることができる。

@Controller
@RequestMapping("/hoges")
public class HogesController {
    @RequestMapping("/{id}")
    public String piyo(@ModelAttribute Param4Form p1, Model model) {
        model.addAttribute("id", p1.getId());
        return "hoges/piyo";
    }
}
java/spring/spring_boot/controller/input_params/start.txt · 最終更新: 2021-06-25 15:10 by ore