gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 16:49:25 24 4
gpt4 key购买 nike

拥有我的 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();
}

在我的 Controller 中注册

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

最佳答案

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

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

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


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

关于Spring 3 自定义编辑器字段替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5552326/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com