【发布时间】:2016-06-04 04:51:06
【问题描述】:
我在 Internet 上看到了很多示例,并且看起来该解决方案应该可以正常工作。但仍然无法使我的代码正常工作。
用户:
@Entity
@Table(name = "users")
public class User implements Serializable{
private static final long serialVersionUID = 1L;
...
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinTable(name = "user_usertypes", joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name = "usertype_id", referencedColumnName = "id"))
private Set<UserType> userTypes;
}
用户类型:
@Entity
@Table(name = "usertypes")
public class UserType implements Serializable{
private static final long serialVersionUID = 1L;
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@Version
@Column(name = "version")
private Integer version;
@Column(name = "name")
private String name;
@ManyToMany(mappedBy = "userTypes")
private Set<User> users;
@Override
public int hashCode() {
int hash = 5;
hash = 83 * hash + Objects.hashCode(this.id);
return hash;
}
@Override
public boolean equals(Object obj) {
System.out.println("comparing objects");
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()){
return false;
}
final UserType other = (UserType) obj;
return Objects.equals(this.id, other.id);
}
}
用户控制器:
@Controller
public class UserController {
@RequestMapping(value = "/user", method = RequestMethod.POST)
public String saveUser(@Valid @ModelAttribute("user") User user, BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
return "users/userform";
}
System.out.println(user.getUserTypes());
userService.saveUser(user);
return "redirect:/user/" + user.getId();
}
@InitBinder
private void initBinder(ServletRequestDataBinder binder) {
binder.registerCustomEditor(Set.class, "userTypes", new CustomCollectionEditor(Set.class) {
protected Object convertElement(Object element) {
if (element != null) {
System.out.println("From Controller: " + element.toString());
return userTypeService.findOne(Integer.parseInt(element.toString()));
}
return null;
}
});
}
用户表单:
<form th:object="${user}" th:action="@{/user}" method="post">
<input type="hidden" th:field="*{id}"/>
<ul>
<li th:each="type : ${types}">
<input type="checkbox" th:id="${type.id}" th:field="*{userTypes}" th:value="${type.id}"/>
<label th:for="${type.id}" th:text="${type.name}">name</label>
</li>
</ul>
<form>
在提交时不调用 initBinder。仅在页面加载时。 因此,我的控制器无法获取 userTypes 对象。什么不见了?谢谢!
【问题讨论】:
-
发帖:
id=1&version=77&contact.id=14&contact.version=0&userTypes=1&_userTypes=on&userTypes=2&_userTypes=on&_csrf=dfffa09b-be52-4d1a-9725-f623aeba81c2
标签: spring-boot thymeleaf