繁体   English   中英

为什么@ModelAttribute 不像@RequestBody 那样工作?

[英]Why @ModelAttribute does not work like @RequestBody?

我的目标是使用form-data设置 POJO 属性。 我有一个通用的 POJO,当我使用JSON时,它按预期工作,所以我不确定form-data行为是否不同。

例如

POJO

public class Account_Info {
  @JsonProperty("name")
  private String firstName;

  public String getFirstName() {
    return firstName;
  }
}

我希望发送以“名称”为键的表单数据。

let formData = new FormData();

formData.append("name", "a");

我的预期结果是: POJO 的firstName属性的值为a

我的实际结果是:POJO 的firstName属性是 null。

我做了什么:

  1. 我创建了一个 Account_InfoDto。
public class Account_InfoDto {
  @JsonProperty("name")
  private String firstName;

  public String getFirstName() {
    return firstName;
  }
}
  1. 我创建了一个 controller

@RequestBody

  @PostMapping(value = "/account_info")
  public Account_InfoDto postAccount_Info(@RequestBody Account_InfoDto account_info) {
    return account_info;
  }

使用@ModelAttribute

  @PostMapping(value = "/account_info", consumes = "multipart/form-data")
  public Account_InfoDto postAccount_Info(@ModelAttribute Account_InfoDto account_info) {
    return account_info;
  }
  1. 向 POST /account_info 发送请求

JSON

{
  "name": "a"
}

实际的反应是:

{
  "name": "a"
}

带有form-data

let formData = new FormData();

formData.append("name", "a");

实际结果是:

{
  "name": null
}

@ModelAttribute用于 thymeleaf 等视图模板,@ @RequestBody在您期望 json 有效负载时使用, @JsonProperty用于映射,formdata 不需要它。 由于您通过 ajax 使用表单数据,因此您不需要在有效负载上进行任何注释。 以下代码

@PostMapping(value = "/account_info")
public Account_InfoDto postAccount_Info(@RequestBody Account_InfoDto account_info) {
return account_info;
}

应该

@PostMapping(value = "/account_info")
public Account_InfoDto postAccount_Info(Account_InfoDto account_info) {
return account_info;
}

你的要求也应该是

let formData = new FormData();

formData.append("firstName", "a");

为您的 DTO 还包括 setter 和 getter

public class Account_InfoDto {
@JsonProperty("name")
private String firstName;

public String getFirstName() {
   return firstName;
 }
public void setFirstName(String firstName) {
   this.firstName=firstName;
 }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM