我有一个域对象ContactGroup,其中包含对另一个域对象Person的 ManyToMany 引用:
@Entity
public class ContactGroup {
@ManyToMany
private Set<Person> members = new HashSet<>();
[...]
}
我需要编辑一个ContactGroup并显示 a)所有可能的Persons with form:checkboxes 和 b) 选择那些已经包含在成员中的人
到目前为止效果很好。我正在使用 form:checkboxes 标记绑定到成员并包含模型属性personList作为项目:
<form:checkboxes path="members" multiple="true" items="${personList}" itemLabel="displayString" itemValue="id"/>
那么问题是什么?
显然,spring 会比较不同项目的 toString() 来评估是否应该检查它们。如果两个Person具有相同的 toString() 表示,则如果其中一个被选中,则它们都将被选中。
我怎样才能改变这种行为?我尝试添加自定义活页夹,但这并没有改变任何东西:
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.setValidator(validator);
binder.registerCustomEditor(Person.class, new PropertyEditorSupport() {
@Override
public void setAsText(String text) throws IllegalArgumentException {
setValue(personService.get(Long.parseLong(text)));
}
});
binder.registerCustomEditor(Set.class, "members", new CustomCollectionEditor(Set.class) {
@Override
protected Object convertElement(Object element) {
if (element instanceof Long) {
return personService.get((Long) element);
} else if (element instanceof String) {
personService.get(Long.parseLong((String) element));
} else if (element instanceof Person) {
return element;
}
return null;
}
});
}