我写了一个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?默认情况下不确定spring是如何做到的)这样做的方法?或者我应该注册一些东西来覆盖它?我对这些想法持开放态度,我感到被困在这里。
谢谢!
转换器: final类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>
答案 0 :(得分:3)
它是春天黑暗面的一部分...如果你没有注册任何转换服务,它会自动执行它并选择一个非常好的,有很多默认转换器。
只要您注册了自己的产品,就会假定您知道原因并且没有在您的配置中添加任何内容......并且您丢失了所有默认转换器!
所以你应该:
FormattingConversionServiceFactoryBean
(我通过调试找到它...)=&gt;很好,你有所有默认转换器!在完整的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
中注册它
答案 1 :(得分:1)
答案 2 :(得分:0)
注册自定义转换器有更好的方法:
<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>