Spring将表单数据绑定到多个(错误的)对象

时间:2016-06-02 14:01:13

标签: java spring spring-mvc data-binding

我遇到了一个错误的错误,表单数据在提交时绑定到一个完全错误的对象。

我正在使用带百里叶的春天,并有以下形式:

<form method="post" th:action="@{/backend/user/create}"
  th:object="${userInCreation}" id="userCreateForm">
  <input th:field="*{firstName}" />Create user</button>
</form>

我要绑定的对象是

public class UserInCreation implements Serializable {

  private String firstName;

  public UserInCreation() {}

  public String getFirstName() {
    return firstName;
  }

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

绑定发生在控制器

@Controller
@RequestMapping("/backend/user")
public class UserController {

  @RequestMapping(value = "/create", method = RequestMethod.GET)
  public String createUserForm(UserInCreation userInCreation) {
    return "backend/user/create";
  }

  @RequestMapping(value = "/create", method = RequestMethod.POST)
  public String createUser(@Valid UserInCreation userInCreation, BindingResult result, Model model) {
    return "backend/user/index";
  }
}

这很好用,尽管存在一个大问题:我输入firstName字段的数据也绑定到Spring-Security Principal,我将其作为ModelAttribute提供:

@ModelAttribute("currentAuthor")
public User getCurrentAuthor(Principal principal, HttpSession session) {
  User author = (User) ((Authentication) principal).getPrincipal();
  return author;
}

User也有一个字段firstName,并且已更改。因此,当我在表单中输入“Some name”并提交时,突然主体的名字将是“Some name”。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我发现了问题所在。实际上,我有一个类型

的功能
@ModelAttribute("foo")
public Foo xyz(@ModelAttribute("bar") Bar bar) {
  ...
}

这违反了规范,但它似乎首先起作用。但它似乎也完全搞乱了数据绑定系统。