Spring:@ModelAttribute VS @RequestBody

Tou*_*one 48 data-binding spring spring-mvc

如果我错了,请纠正我.两者都可用于数据绑定.

问题是何时使用@ModelAttribute?

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

另外,何时使用@RequestBody?

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

根据我的理解,两者都有类似的用途.

谢谢!!

Cha*_*esC 29

我理解的最简单方法是,@ModelAttribute将采用查询字符串.所以,所有数据都通过url传递给服务器.

至于@RequestBody,所有数据将通过完整的JSON主体传递给服务器.

  • 简单来说@RequestBody指定请求的主体。*@ResponseBody* 指定响应的主体。*@ModelAttribute* 和 *@RequestParam* 用于从 URL 解码查询参数。唯一的区别是 *@modelAttribute* 将绑定所有字段并给出一个完整的对象。但如果您使用 *@RequestParam* 您已经通过手动映射所有字段来构建整个对象。欲了解更多信息[请参阅此处](/sf/ask/2055940701/ Between-requestparam-and-modelattribute) (2认同)

Nav*_*raj 13

@ModelAttribute用于绑定来自请求参数的数据(在键值对中),

但@RequestBody用于绑定请求的孔体,如POST,PUT ..请求类型,其中包含其他格式,如json,xml.

  • JSON 也只是键值,JSON 数据与请求参数有何不同? (2认同)

小智 8

如果要进行文件上传,则必须使用@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);
    }

}
Run Code Online (Sandbox Code Playgroud)

产品输入类

@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;
}
Run Code Online (Sandbox Code Playgroud)


oko*_*oko 5

如果您使用ModelAttribute注释,您可以直接访问视图层中的“宠物”对象。此外,您可以在控制器上的方法中实例化此对象以放置模型。看到这个

ModelAttribute使您有机会使用这个对象部分,但使用RequestBody,您可以获得请求的所有主体。


小智 5

我发现@RequestBody(也将类注释为@RestController)更适合AJAX请求,在这些请求中,您可以完全控制正在发出的请求的内容,并且内容以XML或JSON格式发送(因为Jackson).这允许内容容易地创建模型对象.相反,@ ModelAttribute似乎更适合于支持表单的"命令"对象(可能不一定是模型对象)的表单.