【问题标题】:Spring MVC ConversionService DefaultsSpring MVC ConversionService 默认值
【发布时间】:2014-07-16 04:38:27
【问题描述】:

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

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

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

我怎样才能让 ConversionService 使用旧的(PropertyEditor?不太确定默认情况下 spring 是如何做到这一点的)方式?还是我应该注册一些东西来覆盖它?我对想法持开放态度,但我感觉被困在这里。

谢谢!

转换器: final class 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>

【问题讨论】:

    标签: java spring


    【解决方案1】:

    这是 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 bean 来做一些java 配置,或者让你转换一个IntializingBean 并将它注册到afterPropertiesSet

    【讨论】:

    • “春天的阴暗面”如此
    【解决方案2】:

    Serge对此有很好的回应。我最终做的是创建自己的 PropertyEditor(是的 pre-spring 3)并添加它。效果很好!

    【讨论】:

      【解决方案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>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-01-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-08
        • 2015-04-01
        • 1970-01-01
        相关资源
        最近更新 更多