【问题标题】:Spring 3 Custom Editor field replacementSpring 3 自定义编辑器字段替换
【发布时间】:2011-07-29 23:14:30
【问题描述】:

拥有我的价值对象

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 .. 这个魔法怎么可能?

【问题讨论】:

    标签: spring spring-mvc propertyeditor


    【解决方案1】:

    这不是魔术,这是因为泛型只会在编译时被证明。所以你可以在运行时把所有东西都放在一个 Set 中,没有人会检查你是否在 Set 中放入了正确的类型。

    为了让 spring 更聪明一点,你可以尝试将ModelVO 放在你的命令对象中。

    <form:form action="whatEver" method="GET" modelAttribute="modelVO">
    
    
    @RequestMapping(method = RequestMethod.GET)
    public ModelAndView whatEver(@Valid ModelVO modelVO){
       ...
    }
    

    【讨论】:

    • @Jan:顺便说一句,Spring 3.0 有 org.springframework.core.convert.converter.Converter 的概念。它就像一个单向属性编辑器,但它是无状态的,因此性能更高。
    • 它在那里 ;-) 好的。所以现在我发现为集合注册自定义编辑器的正确方法是 binder.registerCustomEditor(Set.class, "recipients", new CustomCollectionEditor(...){ .. } );实现了 convertElement。所以我就这么做了。虽然调试 convertElement 运行,但是在表单提交列表之后仍然没有被填充(包含 0 个元素:)
    • @Jan: >在调试convertElement的同时,表单提交列表仍然没有被填充——发布一个新问题,其中包含你的JSP和控制器
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-12
    • 1970-01-01
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    相关资源
    最近更新 更多