SpringMVC自定义转换器未找到,但在AppContext XML

时间:2017-01-15 22:43:49

标签: spring spring-mvc converter

在我的applicationContext.xml中,我声明了以下2个自定义转换器

<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
    <property name="converters">
        <set>
            <bean class="util.BooleanToYesNoDataTypeConverter"/>
            <bean class="util.YesNoDataTypeToBooleanConverter"/>
        </set>
    </property>
</bean>  

转换器负责在布尔和自定义类型之间进行转换,称为“YesNoDataType&#39;”,

public class BooleanToYesNoDataTypeConverter implements Converter<Boolean,YesNoDataType> {

    @Override
    public YesNoDataType convert(Boolean source) {

        if (Boolean.TRUE.equals(source))
            return YesNoDataType.Y_YES;
        else
            return YesNoDataType.N_NO;

    }

}

public class YesNoDataTypeToBooleanConverter implements Converter<YesNoDataType,Boolean> {

    @Override
    public Boolean convert(YesNoDataType source) {

        if (YesNoDataType.Y_YES.equals(source))
            return Boolean.TRUE;
        else
            return Boolean.FALSE;

    }

}

理论上,转换器现已注册并可以使用,对吗?我跟随此帖中的示例:Spring MVC type conversion : PropertyEditor or Converter?

但是,在我的控制器中,当我进入以下initBinder覆盖时,我会检查当前的活动转换器。猜猜看,我的2台转换器是不可用的。这是为什么?看看下面。

   @Override
    @InitBinder
    public void initBinder(WebDataBinder binder) {

        // Check current ConversionService
        ConversionService conversionService = binder.getConversionService();
        // The below FAILS with a "Converter not found" error
        Boolean b = conversionService.convert(YesNoDataType.Y_YES, Boolean.class);
        // These 2 return FALSE, meaning we CAN'T convert YesNoDataType/Boolean
        System.out.println("Can convert YesNo -> Boolean? " + conversionService.canConvert(Boolean.class, YesNoDataType.class));
        System.out.println("Can convert Boolean -> YesNo? " + conversionService.canConvert(YesNoDataType.class, Boolean.class));

    }

顺便提一下,让我问一个关于Spring / SpringMVC的更广泛的问题。春天的人们取消/关闭了一个存在到2014年的论坛,http://forum.spring.io/。现在获得SpringMVC支持的唯一方法是在StackOverflow上发布这里,但是这里的任何SpringMVC线程都有5-6个视图,没有答案。几年前,社区活跃起来。 SpringMVC发生了什么,它是否已经不再受到良好支持?社区在哪里?只是想知道。

1 个答案:

答案 0 :(得分:0)

就像一个FYI一样,我的Controller中唯一可行的方法是将ConversionService强制转换为GenericConversionService,然后手动调用addConverter(...)方法来添加转换器。

现在我的转换工作正常。但这不是正确的方法 - 我的所有XML注册,包括。转换器类上的@Component注释应该有效。所以问题仍然存在。

@Override
@InitBinder
public void initBinder(WebDataBinder binder) {

// Obtain a GenericConversionService via casting
GenericConversionService conversionService = (GenericConversionService)binder.getConversionService();
// Manually add converters on it
conversionService.addConverter(YesNoDataType.class, Boolean.class, new YesNoDataTypeToBooleanConverter());
conversionService.addConverter(Boolean.class, YesNoDataType.class, new BooleanToYesNoDataTypeConverter());

// Now it works -- these return TRUE
System.out.println("Can convert YesNo -> Boolean? " + conversionService.canConvert(Boolean.class, YesNoDataType.class));
System.out.println("Can convert Boolean -> YesNo? " + conversionService.canConvert(YesNoDataType.class, Boolean.class));