【发布时间】:2012-07-02 22:38:54
【问题描述】:
使用 Spring 3.1 并给出这种情况:
class Thing {
public Thing() {}
public Thing(String someProperty) {}
}
class ThingEditor extends PropertyEditorSupport{
@Override
public void setAsText(String text) {
if (text != null) {
Thing thing = new Thing(text); // or by using a setter method
setValue(thing);
}
}
}
class SomeController {
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(Thing.class, new ThingEditor());
}
}
我发现注册的属性编辑器没有被调用,除非我删除了在Thing 中接受字符串的构造函数 - 对吗?
为什么会这样做而忽略注册的编辑器,我怎样才能让它停止这样做?
【问题讨论】:
-
你能多介绍一下上面的 setAsText 方法吗?
-
已更新 - 但此方法的内容不是问题 - 在调试时,如果该类具有 String 构造函数,它将永远不会进入此方法。
-
可能是因为你提交了一个与“someProperty”同名的字段,在这种情况下它可能不是调用binder来创建“Thing”对象,而是使用setter或构造函数来设置财产。最好通过名称“事物”提交属性,然后显式放置 @RequestParam(..),这可能会强制绑定。
-
这种行为仍然存在于 Spring 4.1.x(用 4.1.5 测试)中,尽管它似乎仅限于目标类的集合。一种解决方法是提供静态工厂方法,而不是接受单个
String参数的构造函数。
标签: java spring spring-mvc