Spring 3 自定义编辑器字段替换

发布于 2024-10-30 14:46:27 字数 1464 浏览 1 评论 0原文

有了我的 ValueObject,

UserVO {
  long id;
  String 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();
}

控制器中的字符串 id#username 解析该对象,在调用自定义编辑器后,我

@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 .. 这种魔法是如何实现的?

Having my ValueObject

UserVO {
  long id;
  String username;
}

I created custom editor for parsing this object from string 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();
}

in my controller i register

@InitBinder
public void initBinder(ServletRequestDataBinder binder) {
    binder.registerCustomEditor(UserVO.class, new UserVOEditor());
}

having in my model object ModelVO

ModelVO { 
           Set<UserVO> users = new HashSet<UserVO>();
}

after custom editor is invoked all you can see after form submission is

ModelVO {
          Set<String> users (linkedHashSet)
}

so when trying to iterate

for(UserVO uvo : myModel.getUser()){ .. }

Im having classCastException .. cannot cast 1234#username (String) to UserVO ..
HOW THIS MAGIC IS POSSIBLE ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

一绘本一梦想 2024-11-06 14:46:27

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

为了使 spring 更加聪明,您可以尝试将 ModelVO 放入您的命令对象中。

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


@RequestMapping(method = RequestMethod.GET)
public ModelAndView whatEver(@Valid ModelVO modelVO){
   ...
}

It is not magic, it is because of Generics will be only proved at compile time. So you can put every thing in a Set at runtime, no one will check if you put the correct type in the Set.

What you can try, to make spring a bit more clever, is to put the ModelVO in your command object.

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


@RequestMapping(method = RequestMethod.GET)
public ModelAndView whatEver(@Valid ModelVO modelVO){
   ...
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文