【发布时间】:2014-07-16 04:38:27
【问题描述】:
我已经编写了如下的 ConversionService。当我有一个包含 IMRM 的对象时,这适用于在控制器中将我的 String 转换为 IMRM。但是,我在系统的另一个地方发现了一个错误。显然,我们之前没有使用过 Spring 3 ConvertorServices(我在这里注册了第一个。)并且系统的一部分依赖于之前的默认值。有问题的区域如下所示:
<input type="checkbox" value="a=b,c=d" id="a=b,c=d">
并且 this 绑定到一个 List java 对象。以前,这只是一个值为“a=b,c=d”的对象,但现在我得到了两个对象[“a=b”,“c=d”]。这是一个问题,因为它没有预料到这种行为,它破坏了这里的旧代码。
我怎样才能让 ConversionService 使用旧的(PropertyEditor?不太确定默认情况下 spring 是如何做到这一点的)方式?还是我应该注册一些东西来覆盖它?我对想法持开放态度,但我感觉被困在这里。
谢谢!
转换器: final class 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>
【问题讨论】: