我遇到了一个错误的错误,表单数据在提交时绑定到一个完全错误的对象。
我正在使用带百里叶的春天,并有以下形式:
<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”。有什么想法吗?
答案 0 :(得分:0)
我发现了问题所在。实际上,我有一个类型
的功能@ModelAttribute("foo")
public Foo xyz(@ModelAttribute("bar") Bar bar) {
...
}
这违反了规范,但它似乎首先起作用。但它似乎也完全搞乱了数据绑定系统。