在我的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发生了什么,它是否已经不再受到良好支持?社区在哪里?只是想知道。
答案 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));