拥有我的ValueObject
UserVO {
long id;
String username;
}
我创建了自定义编辑器,用于从字符串id#username
解析此对象public class UserVOEditor extends PropertyEditorSupport {
@Override
public void setAsText(String text) throws IllegalArgumentException {
Preconditions.checkArgument(text != null,"Null argument supplied when parsing UserVO");
String[] txtArray = text.split("\\#");
Preconditions.checkArgument(txtArray.length == 2, "Error parsing UserVO. Expected: id#username");
long parsedId = Long.valueOf(txtArray[0]);
String username = txtArray[1];
UserVO uvo = new UserVO();
uvo.setUsername(username);
uvo.setId(parsedId);
this.setValue(uvo);
}
@Override
public String getAsText() {
UserVO uvo = (UserVO) getValue();
return uvo.getId()+'#'+uvo.getUsername();
}
在我的控制器中注册
@InitBinder
public void initBinder(ServletRequestDataBinder binder) {
binder.registerCustomEditor(UserVO.class, new UserVOEditor());
}
拥有我的模型对象ModelVO
ModelVO {
Set<UserVO> users = new HashSet<UserVO>();
}
在调用自定义编辑器之后,您可以在表单提交后看到
ModelVO {
Set<String> users (linkedHashSet)
}
所以在尝试迭代时
for(UserVO uvo : myModel.getUser()){ .. }
我有classCastException ..无法将1234#username(String)强制转换为UserVO .. 这个魔法怎么可能?
答案 0 :(得分:0)
这不是魔术,因为Generics只会在编译时证明。因此,您可以在运行时将所有内容放入Set中,没有人会检查您是否在Set中放入了正确的类型。
你可以试着让春天变得更聪明,就是把ModelVO
放在你的命令对象中。
<form:form action="whatEver" method="GET" modelAttribute="modelVO">
@RequestMapping(method = RequestMethod.GET)
public ModelAndView whatEver(@Valid ModelVO modelVO){
...
}