Spring MVC忽略了配置的PropertyEditor并使用构造函数代替。

7
使用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方法的更多内容。 - Biju Kunjummen
已更新 - 但此方法的内容并非问题所在 - 在调试时,如果该类具有String构造函数,则永远不会进入此方法。 - blank
可能是因为您提交了与“someProperty”相同名称的字段,这种情况下它可能不会调用绑定器来创建“Thing”对象,而是使用setter或构造函数来设置属性。更好的方法是通过名称“thing”提交属性,然后明确放置一个@RequestParam(..),这可能会强制执行绑定器。 - Biju Kunjummen
1
这种行为在Spring 4.1.x中仍然存在(已测试过4.1.5),尽管它似乎仅限于目标类的集合。一种解决方法是提供一个静态工厂方法,而不是接受单个String参数的构造函数。 - Koraktor
2个回答

0

在注册PropertyEditorSupport时锁定属性名称:

@InitBinder
public void initBinder(WebDataBinder binder) {
    binder.registerCustomEditor(Thing.class, "someProperty", new ThingEditor());
}

0
通过引入自己的构造函数,您禁用了编译器生成的默认构造函数。框架可能需要默认构造函数才能实例化您的Thing。如果您确实需要自己的构造函数,您也可以提供一个没有任何参数的版本供框架使用。

默认构造函数也在那里 - 已将其添加到问题中。 - blank

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接