リクエストパラメータをモデルにバインドする時、フロント側フレームワークの都合等でリクエストパラメータ名をモデルのフィールド名と合せる事ができない場合がある。
そんな時には、以下の方法で名前の異なるフィールドに強引にバインドする事ができる。
- @InitBinderメソッドを作成する。
- PropertyValuesのインスタンスを作成し、バインドしたいリクエストパラメータを追加する。
- この際、addメソッドの第一引数はバインドしたいモデルのフィールド名にする。
- WebInitBinder.bind()を呼び出す。
例 : リクエストパラメータusernameをUserクラスのnameフィールドにバインドする
User.java
@Data
public class User {
@NotNull
private String name;
}
UserController.java
@Controller
public class UserController {
@ModelAttribute("user")
public User newUser() {
return new User();
}
@InitBinder("user")
public void bindUser(WebDataBinder binder, HttpServletRequest request) {
//リクエストパラメータ"username"をプロパティ名"name"にバインド
MutablePropertyValues pvs = new MutablePropertyValues();
pvs.add("name", request.getParameter("username"));
binder.bind(pvs);
}
@RequestMapping("/")
@ResponseBody
public String index(@Validated @ModelAttribute User user, BindingResult errors) {
if (errors.hasErrors()) {
return errors.toString();
}
return "name:" + user.getName();
}
/?username=hogeでリクエストした結果
name:hoge