Spring:@ModelAttribute VS @RequestBody

时间:2014-02-17 08:24:23

标签: spring spring-mvc 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){ }

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

谢谢!

7 个答案:

答案 0 :(得分:28)

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

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

答案 1 :(得分:11)

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

但@RequestBody用于绑定来自请求的空洞主体的数据,如POST,PUT ..请求类型包含其他格式,如json,xml。

答案 2 :(得分:5)

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

答案 3 :(得分:1)

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

ModelAttribute 使您有机会使用此对象部分,但使用 RequestBody ,您可以获得所有请求。

答案 4 :(得分:0)

我认为@ModelAttribute和@RequestBody都具有相同的用途,只是区别 是@ModelAttribute用于常规spring MVC,而@RequestBody用于REST Web服务。它是@PathVariable和@PathParam。但是在两种情况下我们都可以混合使用。我们可以在REST中使用@PathVariable,反之亦然。

答案 5 :(得分:0)

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

答案 6 :(得分:0)

使用@ModelAttribute,可以在URL参数中传递数据,而使用@RequestBody,则可以将其作为JSON主体传递。如果您要创建REST API,则最好使用@RequestBody。在大多数youtube教程中,您可能会发现使用@ModelAttribute-这仅仅是因为它们可能展示了有关Spring MVC的概念,并且正在使用URL传递数据。