繁体   English   中英

Spring MVC ConversionService默认值

[英]Spring MVC ConversionService Defaults

我已经编写了如下的ConversionService。 当我具有包含IMRM的对象时,这可以将控制器中的String转换为IMRM。 但是,我在系统的另一个地方遇到了一个错误。 显然,我们之前没有使用过Spring 3 ConvertorServices(我在这里注册了第一个。),并且系统的一部分依赖于以前的默认值。 有问题的区域如下所示:

<input type="checkbox" value="a=b,c=d" id="a=b,c=d">

并且这绑定到List java对象。 以前,这只是一个值为“ a = b,c = d”的对象,但现在我得到了两个对象[“ a = b”,“ c = d”]。 这是一个问题,因为它不期望这种行为,并且会破坏此处的旧代码。

我如何才能使ConversionService使用旧的(PropertyEditor?不是很确定默认情况下该如何做)这种方式? 还是我应该注册一些东西来替代它? 我乐于接受想法,感到被困在这里。

谢谢!

转换器:最终类StringToIMRM实现了转换器{

private static final Logger LOG = LoggerFactory.getLogger(StringToIMRM.class);

@Override
public IMRM convert(String source) {
    ObjectMapper mapper = new ObjectMapper();
    try {
        return mapper.readValue(source, IMRM.class);
    } catch (Exception e) {
        if (e instanceof JsonParseException || e instanceof IOException || e instanceof JsonMappingException) {
            LOG.error("Error converting String to IMRM object. source={}", source, e);
        }
        throw new IllegalArgumentException("Error converting String to IMRM object.", e);
    }
}

和这个类:

public class ConversionServiceInitializer implements WebBindingInitializer {
    @Autowired
    private ConversionService conversionService;

    @Override
    public void initBinder(WebDataBinder binder, WebRequest request) {
        binder.setConversionService(conversionService);
    }
}

这是我的XML设置。

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
    <property name="webBindingInitializer">
        <bean class="com.saasure.framework.web.bind.ConversionServiceInitializer"/>
    </property>
</bean>

和:

<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
    <property name="converters">
        <list>
            <bean class="com.saasure.application.generic.setup.beans.StringToIMRM"/>
        </list>
    </property>
</bean>

这是春天的阴暗面的一部分...如果您不注册任何转换服务,它将自动执行该操作,并选择一个非常不错的默认转换转换器。

一旦您注册了自己的,它就会假定您知道原因,并且不会在配置中添加任何内容...并且您已经丢失了所有默认转换器!

所以你应该:

  • 首先注册什么是spring默认值: FormattingConversionServiceFactoryBean (我是通过调试找到的...)=>好的,您具有所有默认值转换器!
  • 将您所有的转换器添加到这一台

在完整的XML配置中,它可能类似于:

<bean id="conversionService"
      class="org.springframework.format.support.FormattingConversionServiceFactoryBean"/>
<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"
      p:targetObject-ref="conversionService" p:targetMethod="addConverter">
    <property name="arguments">
        <list>
            <value type="java.lang.Class">java.lang.String</value>
            <value type="java.lang.Class">package.to.IMRM</value>
            <bean class="com.saasure.application.generic.setup.beans.StringToIMRM"/>
        </list>
    </property>
</bean>

如果你没有喜欢MethodInvokingFactoryBean ,您可以使用Configuration豆做一些Java的配置,也让你的转换器IntializingBean ,并在其注册afterPropertiesSet

塞尔对此有很好的回应。 我最终要做的是创建自己的PropertyEditor(是在Spring 3之前)并添加它。 效果很好!

有一种更好的方法来注册自定义转换器:

<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
    <property name="registerDefaultFormatters" value="true" />
    <property name="converters">
        <bean class="com.saasure.application.generic.setup.beans.StringToIMRM" />
    </property>
</bean>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM