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

时间:2021-02-27 08:35:18

标签: java spring-mvc

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

例如

POJO

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

  public String getFirstName() {
    return firstName;
  }
}

我想发送一个以“name”为关键字的表单数据。

let formData = new FormData();

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

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

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

我做了什么:

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

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

带有@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
}

1 个答案:

答案 0 :(得分:-1)

@ModelAttribute 与 thymeleaf 等视图模板一起使用,@RequestBody 用于期望 json 有效负载,@JsonProperty 用于映射,formdata 不需要它。由于您通过 ajax 使用 formdata,因此您的有效负载上不需要任何注释。以下代码

@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;
 }
}