Spring MVC 类型转换:PropertyEditor 还是 Converter?

2023-11-24

我正在寻找在 Spring MVC 中绑定和转换数据的最简单的方法。如果可能的话,不做任何xml配置。

到目前为止我一直在使用属性编辑器像这样:

public class CategoryEditor extends PropertyEditorSupport {

    // Converts a String to a Category (when submitting form)
    @Override
    public void setAsText(String text) {
        Category c = new Category(text);
        this.setValue(c);
    }

    // Converts a Category to a String (when displaying form)
    @Override
    public String getAsText() {
        Category c = (Category) this.getValue();
        return c.getName();
    }

}

and

...
public class MyController {

    @InitBinder
    public void initBinder(WebDataBinder binder) {
        binder.registerCustomEditor(Category.class, new CategoryEditor());
    }

    ...

}

这很简单:两个转换都在同一个类中定义,并且绑定很简单。如果我想在所有控制器之间进行通用绑定,我仍然可以添加我的 xml 配置中有 3 行.


但是 Spring 3.x 引入了一种新的方法来做到这一点,使用转换器 :

在 Spring 容器内,该系统可以用作替代方案 至 PropertyEditors

假设我想使用转换器,因为它是“最新的替代方案”。我必须创建two转换器:

public class StringToCategory implements Converter<String, Category> {

    @Override
    public Category convert(String source) {
        Category c = new Category(source);
        return c;
    }

}

public class CategoryToString implements Converter<Category, String> {

    @Override
    public String convert(Category source) {
        return source.getName();
    }

}

第一个缺点:我必须上两节课。优点:由于通用性,无需强制转换。

那么,如何简单地对转换器进行数据绑定呢?

第二个缺点:我还没有找到任何简单的方法(注释或其他编程设施)来在控制器中执行此操作:没有什么比someSpringObject.registerCustomConverter(...);.

我发现的唯一方法是乏味的,不简单,并且仅涉及一般的跨控制器绑定:

  • XML配置 :

    <bean id="conversionService"
      class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <bean class="somepackage.StringToCategory"/>
                <bean class="somepackage.CategoryToString"/>
            </set>
        </property>
    </bean>
    
  • Java配置 (仅在 Spring 3.1+ 中) :

    @EnableWebMvc
    @Configuration
    public class WebConfig extends WebMvcConfigurerAdapter {
    
        @Override
        protected void addFormatters(FormatterRegistry registry) {
            registry.addConverter(new StringToCategory());
            registry.addConverter(new CategoryToString());
        }
    
    }
    

既然有这些缺点,为什么还要使用转换器呢?我错过了什么吗?还有其他我不知道的技巧吗?

我很想继续使用 PropertyEditors...绑定更加容易和快捷。


既然有这些缺点,为什么还要使用转换器呢?我失踪了吗 某物 ?还有其他我不知道的技巧吗?

不,我认为您已经非常全面地描述了 PropertyEditor 和 Converter,以及它们是如何声明和注册的。

在我看来,PropertyEditor 的范围是有限的 - 它们帮助将 String 转换为类型,并且该字符串通常来自 UI,因此使用 @InitBinder 和使用 WebDataBinder 注册 PropertyEditor 是有意义的。

另一方面,转换器更通用,它适用于系统中的任何转换 - 不仅仅是 UI 相关的转换(字符串到目标类型)。例如,Spring Integration 广泛使用转换器来将消息有效负载转换为所需的类型。

我认为对于 UI 相关流程,PropertyEditors 仍然适用,特别是在您需要为特定命令属性执行自定义操作的情况下。对于其他情况,我会采用 Spring 参考的建议并编写一个转换器(例如,从 Long id 转换为实体,例如作为示例)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring MVC 类型转换:PropertyEditor 还是 Converter? 的相关文章

随机推荐