質問
@ModelAttribute アノテーションは、postman によって渡された json パラメータを受け入れますが、値を受け取ることができません。実は、@ModelAttribute についてあまり詳しくないので、調べてみました。
@RequestMapping("/test")
public String test(@ModelAttribute("user") User user2) {
System.out.println("user2"+JSON.toJSONString(user2));
return "test";
}
このままでは、postman から渡された JSON データを受信できなくなります。
実際、これは主に @ModelAttribute の使用法に対する理解が不十分であることが原因です。
@ModelAttribute アノテーションは、メソッドおよびメソッド パラメーターで使用できます。
- メソッドのアノテーション
@ModelAttribute のアノテーションが付けられたメソッドは、このコントローラーの各メソッドが実行される前に実行されます。したがって、複数の URL をマッピングする 1 つのコントローラーを使用する場合は、注意して使用してください。 - @ModelAttribute はメソッドのパラメーターに注釈を付けます。
メソッド パラメーターに注釈を付けるには 2 つのケースがあります
a. モデルから取得します。たとえば、次のようになります。
@ModelAttribute("user")
public void addUser(@RequestBody User user, Model model) {
System.out.println("ModelAttribute:"+1);
model.addAttribute(user);
}
/**
* test
* @return string
*/
@RequestMapping("/test")
public String test(@ModelAttribute("user") User user2) {
System.out.println("user2"+JSON.toJSONString(user2));
return "test";
}
このうち、addUser には別の書き方があります
public User addUser(@RequestBody User user) {
System.out.println("ModelAttribute:"+1);
return user;
}
この例では、 @ModelAttribute("user") ユーザー user2 がメソッド パラメーターに注釈を付けており、パラメーター user の値は addUser() メソッドのモデル属性から取得されます。
b. Form フォームまたは URL パラメーターから取得します (実際には、このコメントなしでユーザー オブジェクトを取得できます)
@RequestMapping("/test")
public String test(@ModelAttribute("user") User user2) {
System.out.println("user2"+JSON.toJSONString(user2));
return "test";
}
上記の問題は JSON 形式でデータを受信することであるため、b は状況を満たせません。私が考え始めた解決策は、
以下のように @RequestBody を追加することでした。
@RequestMapping("/test")
public String test(@RequestBody @ModelAttribute("user") User user2) {
System.out.println("user2"+JSON.toJSONString(user2));
return "test";
}
その後、まったく機能しないことがわかったので、 a.Get it from the model! を使用することしかできません。
そこで、次の解決策があります。
public User addUser(@RequestBody User user) {
System.out.println("ModelAttribute:"+1);
return user;
}
@RequestMapping("/test")
public String test(@RequestBody @ModelAttribute("user") User user2) {
System.out.println("user2"+JSON.toJSONString(user2));
return "test";
}