[英]Spring MVC ConversionService Defaults
我已经编写了如下的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?不是很确定默认情况下该如何做)这种方式? 还是我应该注册一些东西来替代它? 我乐于接受想法,感到被困在这里。
谢谢!
转换器:最终类StringToIMRM实现了转换器{
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>
这是春天的阴暗面的一部分...如果您不注册任何转换服务,它将自动执行该操作,并选择一个非常不错的默认转换转换器。
一旦您注册了自己的,它就会假定您知道原因,并且不会在配置中添加任何内容...并且您已经丢失了所有默认转换器!
所以你应该:
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
豆做一些Java的配置,也让你的转换器IntializingBean
,并在其注册afterPropertiesSet
。
塞尔对此有很好的回应。 我最终要做的是创建自己的PropertyEditor(是在Spring 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>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.