JavaSpring自定义转换器被覆盖
这是我的第一篇帖子,所以如果我错过了发布一个好问题的惯例,请原谅
我正在使用Spring REST编写一个RESTful服务。该服务的签名如下
@RestController
@RequestMapping(value = "/{param1}/{param2}/myservice", produces = MediaType.APPLICATION_JSON_VALUE)
public class MyService {
@RequestMapping(value = "/{param3}", method = GET)
public MyResponseObj getMyResponseDetails(MyRequestObject request){
//Service logic code
}
}
在上面的示例中,MyRequestObject包含一个具有特定格式的自定义日期对象。对于这个问题的参考,在MyRequestObject中MyDate的自定义日期对象的名称是MyDate
我的目标是将myDate的字符串值转换为名为myDate的查询参数。我特意将查询参数名与MyRequestObject类中的内部对象名保持一致,这样Spring就可以隐式地将值赋给方法参数的MyRequestObject实例的myDate属性。为了进行这个自动赋值,我确保为MyDate保留一个带有字符串参数的构造函数。但是,Spring不会为myDate值自动赋值
因此,在阅读了这个论坛上的几篇帖子后,我创建了一个自定义转换器,将字符串对象转换为MyDate对象。下面是我的代码
@Component
public class StringToMyDateConverter implements Converter<String, MyDate> {
public MyDate convert(String s){
//MyDate.parseData(String) is a custom method to convert a String to MyDate object
return MyDate.parseData(s);
}
}
然后,我在Spring配置中添加了以下配置。xml文件,将此自定义转换器类添加到Spring的默认转换服务中
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="com.my.service.rest.util.conversion.StringToMyDateConverter"/>
</set>
</property>
</bean>
在应用程序启动和调试期间,我发现我的自定义转换器代码正在执行,Spring的默认转换器服务将注册我的自定义转换器。然而,我也注意到,Spring初始化FormattingConversionServiceFactoryBean的内部代码在服务启动期间被多次执行。这最终导致转换器服务列表被覆盖,之前没有注册我的自定义转换器
所以,当我调用下面提到的REST服务URL时,我得到下面提到的错误
URL http://localhost:7880/project/json/value1/value2/myservice/value3?myDate=2017-09-12
例外情况
org.springframework.validation.BindException:
org.springframework.validation.BeanPropertyBindingResult: 1 errors
Field error in object 'request' on field 'myDate': rejected value [2017-09-12]; codes [typeMismatch.request.myDate,typeMismatch.myDate,typeMismatch.com.my.service.xml.datatype.MyDate,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [request.myDate,myDate]; arguments []; default message [myDate]]; default message [Failed to convert property value of type [java.lang.String] to required type [com.my.service.xml.datatype.MyDate] for property 'myDate'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [com.my.service.xml.datatype.MyDate] for property 'myDate': no matching editors or conversion strategy found]
这里有一点很重要,我的项目有一个复杂的模块结构,有多个Spring配置
我认为,因为Spring多次初始化默认转换服务。不过,我无法确定配置调用的顺序,以便防止Spring覆盖列表中添加的客户配置。我还尝试了下面列出的基于注释的配置类来实现这个结果。但这也导致了同样的问题
@Configuration
public class ConversionServiceProvider {
@Autowired
private StringToMyDateConverter stringToMyDateConverter;
@Bean
public ConversionService getConversionService() {
ConversionServiceFactoryBean bean = new ConversionServiceFactoryBean();
bean.setConverters(getConverters());
bean.afterPropertiesSet();
ConversionService object = bean.getObject();
return object;
}
private Set<Converter<?, ?>> getConverters() {
Set<Converter<?, ?>> converters = new HashSet<>();
converters.add(stringToMyDateConverter);
// add here more custom converters, either as spring bean references or directly instantiated
return converters;
}
}
你能给我一些建议,让我在这里尝试解决这个问题吗?请原谅我提了这么长的问题,但我认为这将有助于更好地了解情况和问题
谢谢
共 (0) 个答案