3

拥有我的 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 .. 这魔法怎么可能?

4

1 回答 1

0

这不是魔术,这是因为泛型只会在编译时被证明。因此,您可以在运行时将所有内容放入 Set 中,没有人会检查您是否在 Set 中放入了正确的类型。

您可以尝试使 spring 更聪明一点,就是将 放入ModelVO您的命令对象中。

<form:form action="whatEver" method="GET" modelAttribute="modelVO">


@RequestMapping(method = RequestMethod.GET)
public ModelAndView whatEver(@Valid ModelVO modelVO){
   ...
}
于 2011-04-05T14:53:01.167 回答