[英]Why @ModelAttribute does not work like @RequestBody?
My goal is to set a POJO attribute with form-data
.我的目标是使用
form-data
设置 POJO 属性。 I have a generic POJO, and when I use JSON
it works as expected, so I am not sure form-data
behave differently.我有一个通用的 POJO,当我使用
JSON
时,它按预期工作,所以我不确定form-data
行为是否不同。
eg例如
The POJO POJO
public class Account_Info {
@JsonProperty("name")
private String firstName;
public String getFirstName() {
return firstName;
}
}
I wish to send a form data with "name" as key.我希望发送以“名称”为键的表单数据。
let formData = new FormData();
formData.append("name", "a");
My expected result is: The POJO's attribute of firstName
will have a value of a
.我的预期结果是: POJO 的
firstName
属性的值为a
。
My actual result is: The POJO's attribute of firstName
is null.我的实际结果是:POJO 的
firstName
属性是 null。
What I did:我做了什么:
public class Account_InfoDto {
@JsonProperty("name")
private String firstName;
public String getFirstName() {
return firstName;
}
}
with @RequestBody
与
@RequestBody
@PostMapping(value = "/account_info")
public Account_InfoDto postAccount_Info(@RequestBody Account_InfoDto account_info) {
return account_info;
}
with @ModelAttribute
使用
@ModelAttribute
@PostMapping(value = "/account_info", consumes = "multipart/form-data")
public Account_InfoDto postAccount_Info(@ModelAttribute Account_InfoDto account_info) {
return account_info;
}
with JSON
与
JSON
{
"name": "a"
}
The actual response is:实际的反应是:
{
"name": "a"
}
with form-data
带有
form-data
let formData = new FormData();
formData.append("name", "a");
The actual result is:实际结果是:
{
"name": null
}
@ModelAttribute
is used with view templates such as thymeleaf, and @RequestBody
is used when you expect json payload, @JsonProperty
is for mapping, it is not needed for formdata. @ModelAttribute
用于 thymeleaf 等视图模板,@ @RequestBody
在您期望 json 有效负载时使用, @JsonProperty
用于映射,formdata 不需要它。 Since you are using formdata via ajax, you do not need any annotation on your payload.由于您通过 ajax 使用表单数据,因此您不需要在有效负载上进行任何注释。 the following code
以下代码
@PostMapping(value = "/account_info")
public Account_InfoDto postAccount_Info(@RequestBody Account_InfoDto account_info) {
return account_info;
}
should be应该
@PostMapping(value = "/account_info")
public Account_InfoDto postAccount_Info(Account_InfoDto account_info) {
return account_info;
}
also your request should be你的要求也应该是
let formData = new FormData();
formData.append("firstName", "a");
for your DTO also include setters and getters为您的 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.