web-dev-qa-db-ja.com

春:@ModelAttribute VS @RequestBody

私が間違っている場合は修正してください。両方ともData Bindingに使用できます。

問題は、@ ModelAttributeをいつ使用するかです。

@RequestMapping(value="/owners/{ownerId}/pets/{petId}/edit", method = RequestMethod.POST)
public String processSubmit(@ModelAttribute Pet pet) { }

また、@ RequestBodyを使用するタイミングは?

@RequestMapping(value = "/user/savecontact", method = RequestMethod.POST
public String saveContact(@RequestBody Contact contact){ }

私の理解によると、どちらも同様の目的に役立ちます。

ありがとう!!

48
Touchstone

私が理解する最も簡単な方法は、@ModelAttributeはクエリ文字列を取ります。そのため、すべてのデータはURLを介してサーバーに渡されます。

はどうかと言うと @RequestBody、すべてのデータは完全なJSON本体を介してサーバーに渡されます。

29
CharlesC

@ModelAttributeは、リクエストパラメータ(キーと値のペア)からのデータのバインドに使用されます。

しかし、@RequestBodyは、POST、PUTなどのリクエスト全体のデータをバインドするために使用されます。json、xmlなどの他の形式を含むリクエストタイプ。

13
Naveen raj

@RequestBody(クラスに@RestControllerとしても注釈を付ける)の方が、AJAXリクエストのコンテンツを完全に制御し、コンテンツがXMLまたはJSON(ジャクソンのため):これにより、コンテンツはモデルオブジェクトを簡単に作成できます逆に、@ ModelAttributeは、フォームをバッキングする「コマンド」オブジェクト(必ずしもモデルオブジェクトであるとは限りません)があるフォームに適しているようです。 。

5
kondrak

ModelAttributeアノテーションを使用すると、ビューレイヤーで「pet」オブジェクトに直接アクセスできます。また、コントローラーのメソッドでこのオブジェクトをインスタンス化して、モデルを配置できます。 これを参照

ModelAttributeはこのオブジェクトを部分的に使用する機会を与えますが、RequestBodyを使用すると、リクエストのすべてのボディを取得できます。

1
oko

ファイルのアップロードを行う場合は、@ModelAttributeを使用する必要があります。 @RequestBodyでは、不可能です。サンプルコード

@RestController
@RequestMapping(ProductController.BASE_URL)
public class ProductController {

    public static final String BASE_URL = "/api/v1/products";

    private ProductService productService;

    public ProductController(ProductService productService) {
        this.productService = productService;
    }

    @PostMapping
    @ResponseStatus(HttpStatus.CREATED)
    public ProductDTO createProduct(@Valid @ModelAttribute ProductInput productInput) {
        return productService.createProduct(productInput);
    }

}

ProductInputクラス

@Data
public class ProductInput {

    @NotEmpty(message = "Please provide a name")
    @Size(min = 2, max = 250, message = "Product name should be minimum 2 character and maximum 250 character")
    private String name;

    @NotEmpty(message = "Please provide a product description")
    @Size(min = 2, max = 5000, message = "Product description should be minimum 2 character and maximum 5000 character")
    private String details;

    @Min(value = 0, message = "Price should not be negative")
    private float price;

    @Size(min = 1, max = 10, message = "Product should have minimum 1 image and maximum 10 images")
    private Set<MultipartFile> images;
}
0
Rejuan

@ModelAttributeと@RequestBodyはどちらも同じように使用されていると思いますが、通常のMVCで@ModelAttributeを使用し、REST Webサービスで@RequestBodyを使用します。@ PathVariableと@PathParamです。 @PathVariableをRESTとその逆に使用できます。

0
shubham bellale