@ModelAttribute vs @RequestBody,@ ResponseBody

时间:2018-02-18 01:49:58

标签: spring

@ModelAttribute

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

http://.../?name=Something&age=100
public String doSomething(@ModelAttribute User user) { }

@RequestBody

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

{ "name": "Something", "age": "100" } in request body
public String doSomething(@RequestBodyUser user) { }

@ModelAttribute将采用查询字符串。所以,所有数据都通过url传递给服务器

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

  1. 现在哪一个是最好的方法???
  2. 如果两者都是为了同一目的而绑定到bean ...哪一个是最佳实践或广泛用作标准实践?
  3. 两者都处理多部分文件并且两者都有相同的选项吗? https://javabeat.net/spring-multipart-file-upload/ How do i upload/stream large images using Spring 3.2 spring-mvc in a restful way

  4. 他们中的任何一个是否比另一个具有更少的能力?像长度限制一样,方法限制。缺点

  5. 哪一个在安全方面更安全?

1 个答案:

答案 0 :(得分:2)

正如javadoc所建议的,用法是将它们区分开来,即,如果要将对象绑定回Web视图,请使用@ModelAttribute;如果不需要,请使用@RequestBody

  • @RequestBody

    • 用例:宁静的控制器(例如:生产和使用json / xml,处理直接文档下载请求,搜索内容,ajax请求)
    • 顾名思义,如果方法参数使用@RequestBody注释进行注释,Spring会将HTTP请求正文转换为方法参数的Java类型。
    • 仅允许用于方法参数(@Target(value = {PARAMETER}))
    • 请求的主体通过HttpMessageConverter传递,以根据请求的内容类型来解析方法参数。
    • 适用于Post而不适用于Get方法。
  • @ModelAttribute

    • 用例:Web应用程序控制器(例如:绑定请求查询参数,使用选项和默认值填充Web视图)
    • 使用数据绑定器和ConversionService
    • 允许在方法和方法参数上使用(@Target(value = {METHOD,PARAMETER}))
    • 在处理模型属性以在Srping的模型对象之间添加和检索模型属性时很有用
    • 在METHODS上使用时,这些方法在调用@RequestMapping注释的控制器方法之前被调用
    • 将方法PARAMETER或方法返回值绑定到命名模型属性,绑定的命名模型属性将显示在Web视图中
    • 将请求查询参数绑定到bean

有关数据绑定和类型转换的更多信息,请参见:https://docs.spring.io/spring/docs/5.1.x/spring-framework-reference/core.html#validation