Spring MVC ConversionService默认值

时间:2014-07-16 04:38:27

标签: java spring

我写了一个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?默认情况下不确定spring是如何做到的)这样做的方法?或者我应该注册一些东西来覆盖它?我对这些想法持开放态度,我感到被困在这里。

谢谢!

转换器:     final类StringToIMRM实现Converter {

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>

3 个答案:

答案 0 :(得分:3)

它是春天黑暗面的一部分...如果你没有注册任何转换服务,它会自动执行它并选择一个非常好的,有很多默认转换器。

只要您注册了自己的产品,就会假定您知道原因并且没有在您的配置中添加任何内容......并且您丢失了所有默认转换器!

所以你应该:

  • 首先注册弹簧默认值:FormattingConversionServiceFactoryBean(我通过调试找到它...)=&gt;很好,你有所有默认转换器!
  • 将所有转换器添加到此

在完整的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 bean来做一些java配置,或者让转换器成为IntializingBean并在afterPropertiesSet中注册它

答案 1 :(得分:1)

塞尔对此有很好的回应。我最终做的是创建我自己的PropertyEditor(是春季前3)并添加它。这很棒!

答案 2 :(得分:0)

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

<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>