有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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包含一个具有特定格式的自定义日期对象。对于这个问题的参考,在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配置中添加了以下配置。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) 个答案