Java Spring自定义转换器被覆盖

Java Spring自定义转换器被覆盖,java,spring,spring-mvc,spring-rest,Java,Spring,Spring Mvc,Spring Rest,这是我的第一篇帖子,所以如果我没有遵守发布一个好问题的惯例,请原谅 我正在使用SpringREST编写一个RESTful服务。该服务的签名如下 @RestController @RequestMapping(value = "/{param1}/{param2}/myservice", produces = MediaType.APPLICATION_JSON_VALUE) public class MyService { @RequestMapping(value = "/{para

这是我的第一篇帖子,所以如果我没有遵守发布一个好问题的惯例,请原谅

我正在使用SpringREST编写一个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包含具有特定格式的自定义日期对象。对于此问题的参考,在MyRequestObjectMyDate的自定义日期对象的名称为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配置。

我认为,因为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;
    }
}
@配置
公共类转换服务提供程序{
@自动连线
私有StringToMyDateConverter StringToMyDateConverter;
@豆子
公共转换服务getConversionService(){
ConversionServiceFactoryBean=新的ConversionServiceFactoryBean();
setConverters(getConverters());
bean.afterPropertieSet();
ConversionService对象=bean.getObject();
返回对象;
}
私有集>转换器=新哈希集();
添加(stringToMyDateConverter);
//在这里添加更多自定义转换器,作为Springbean引用或直接实例化
回流转换器;
}
}
你能给我一些建议,我可以在这里尝试解决这个问题吗?请原谅我提了这么长的问题,但我认为这将有助于更好地了解情况和问题


谢谢

我可以通过在我的自定义对象中添加一个签名为
public MyDate valueOf(String value){…}
的方法来实现将字符串对象转换为自定义对象的目标。我意识到Spring可以通过在自定义类中调用这个新方法,自动调用这个方法将String对象转换为我的自定义对象。然而,最初的谜团仍然没有解决,因为我仍然不知道为什么我添加的自定义转换器没有生效,并且被覆盖。
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]
@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;
    }
}