为什么春天不使用我的Converter <string,date =“”>?</string,>

时间:2011-05-12 18:56:33

标签: java spring

我在applicationContext.xml

中有这个
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />
<mvc:annotation-driven conversion-service="conversionService"/>
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
    <property name="converters">
        <set>
            <bean class="mycompany.AsOfDateConverter"/>
            <bean class="mycompany.CustomerConverter"/>
            <bean class="mycompany.FooConverter"/>
        </set>
    </property>
</bean>

AsOfDateConverter看起来像

public class AsOfDateConverter implements Converter<String, Date> {
    @Override
    public Date convert(String source) {
        if(source == null) return new Date();
        //... else parse date. not shown.
    }

}

但Spring从来没有拿起我的DateConverter。相反,我得到了这个

org.springframework.beans.ConversionNotSupportedException: Failed to convert value of type 'java.lang.String' to required type 'java.util.Date'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [java.util.Date]: no matching editors or conversion strategy found
    at org.springframework.beans.SimpleTypeConverter.convertIfNecessary(SimpleTypeConverter.java:53)
    at org.springframework.validation.DataBinder.convertIfNecessary(DataBinder.java:534)
    at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveRequestParam(HandlerMethodInvoker.java:506)
    at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveHandlerArguments(HandlerMethodInvoker.java:339)
    at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:170)

需要两种解决方案: a)为什么不使用我的转换器? b)如果date为null,那么转换器仍可以调用我的转换器吗?

我已将所有这些与PropertyEditors配合使用,但希望移植到转换器。

但我无法弄清楚为什么Spring MVC不使用我的DateConverter。我实现了它,如果源

2 个答案:

答案 0 :(得分:3)

我可以给你一个提示: 从'class.springframework.beans.SimpleTypeConverter'类抛出异常。 此类属于PropertyEditor支持(Framwork),但不属于ConversionService Framework。

因此,混合两者无法正常工作,或者未启用ConversionService:

5.5.5 Configuring a ConversionService

  

如果没有向Spring注册ConversionService,则使用原始的基于PropertyEditor的系统。

答案 1 :(得分:3)

我也有

2012-06-26 12:41:55,215 DEBUG DefaultHandlerExceptionResolver - Resolving exception from handler [public org.springframework.http.ResponseEntity<Resource<java.lang.Object>> StatisticsController.getStats(java.util.Date)]: org.springframework.beans.ConversionNotSupportedException: Failed to convert value of type 'java.lang.String' to required type 'java.util.Date'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [java.util.Date]: no matching editors or conversion strategy found 

尝试调用我的控制器方法时

public ResponseEntity<Resource<Object>> getStats(@RequestParam Date fromDate)

阅读

上的ConversionServiceFactoryBean

http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html

表示日期支持需要我们不想要的JODA时间。所以我尝试将自己的转换器(实现Converter)添加到ConversionServiceFactoryBean

<bean id="conversionService"
      class="org.springframework.context.support.ConversionServiceFactoryBean">
    <property name="converters">
        <list>
            <bean class="MyStringToDateConverter"/>
        </list>
    </property>
</bean>

并将其绑定到mvc-annotation驱动标记:

<mvc:annotation-driven  conversion-service="conversionService"/> 

但我从来没有让我的转换器开始。我总是“找不到匹配的编辑器或转换策略”。

如上所述,我希望使用Spring MVC 3.x风格的转换服务,但我不得不使用init binder的旧方法来解决这个问题。

/**
 * I would claim this is should not be needed in Spring 3.x with ConversionServiceFactoryBean
 * @param binder
 */
@InitBinder
public void initBinder(WebDataBinder binder) {
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false));
}

立即起作用。