@ModelAttribute从请求参数而不是支持表单填充表单字段

时间:2019-04-21 17:23:08

标签: java spring spring-boot spring-mvc modelattribute

我的问题是: 如果请求参数和表单字段具有相同的名称,则@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,这些元素是从“表单字段”填充的。 如何解决这个问题...?

1 个答案:

答案 0 :(得分:1)

如果只希望请求正文(包含表单数据)填充Java对象,则应使用@RequestBody注释而不是@ModelAttribute

(请注意,在查询字符串和表单数据中传递相同参数名称的设计很糟糕。如果可能,请重构)