我的问题是: 如果请求参数和表单字段具有相同的名称,则@ModelAttribute会从请求参数而不是表单DTO填充表单字段。
示例:我有一个输入名为name
的表单:
<input type="text" name="name" />
给出值名称为John的表单,
如果我使用网址提交表单(网络方法POST):
http://localhost:8080/user/?name=Michael
我将具有相同名称的查询参数和表单字段。
我期望的是:名称字段应从表单字段而不是查询参数中填充。
MyForm.java
public class MyForm {
private String name;
private Boolean isMale;
private Byte status;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Boolean getIsMale() {
return isMale;
}
public void setIsMale(Boolean isMale) {
this.isMale = isMale;
}
public Byte getStatus() {
return status;
}
public void setStatus(Byte status) {
this.status = status;
}
}
MyController.java
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping(value = "/", method = RequestMethod.POST)
public String index(
Model model,
@ModelAttribute("form") MyForm form,
BindingResult bindingResult) {
String name = form.getName(); //this contains value from form: Michael
Boolean isMale = form.getIsMale(); //this contains value from query parameter: true
Byte status= form.getStatus(); //this contains value from form: 1
return "views/index";
}
当我提交带有值的表单时:
name = Michael
isMale = false
status = 1
使用带有查询参数的网址:
http://localhost:8080/user/?isMale=true
然后isMale
将包含值true
,该值从查询参数中填充。
我期望的是,isMale
应该包含false
,这些元素是从“表单字段”填充的。
如何解决这个问题...?
答案 0 :(得分:1)
如果只希望请求正文(包含表单数据)填充Java对象,则应使用@RequestBody
注释而不是@ModelAttribute
(请注意,在查询字符串和表单数据中传递相同参数名称的设计很糟糕。如果可能,请重构)