SpringBoot のアノテーション @ModelAttribute の概要

質問

  @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 アノテーションは、メソッドおよびメソッド パラメーターで使用できます。

  1. メソッドのアノテーション
    @ModelAttribute のアノテーションが付けられたメソッドは、このコントローラーの各メソッドが実行される前に実行されます。したがって、複数の URL をマッピングする 1 つのコントローラーを使用する場合は、注意して使用してください。
  2. @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";
 }
 

おすすめ

転載: blog.csdn.net/Youning_Yim/article/details/115835737