【问题标题】:Spring MVC ignores configured PropertyEditor and uses constructor insteadSpring MVC 忽略配置的 PropertyEditor 并使用构造函数代替
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 默认构造函数也在那里 - 将其添加到问题中。
【解决方案2】:

注册 PropertyEditorSupport 时锁定属性名称:

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

【讨论】:

    猜你喜欢
    • 2017-11-03
    • 1970-01-01
    • 2021-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-08
    • 2020-10-18
    • 2021-04-29
    相关资源
    最近更新 更多