【发布时间】:2014-09-07 15:27:57
【问题描述】:
我正在玩 Spring 的 ConversionService,添加一个简单的转换器来将 ZonedDateTime (Java 8) 转换为 String:
@Bean
public ConversionServiceFactoryBean conversionServiceFactoryBean() {
ConversionServiceFactoryBean conversionServiceFactoryBean =
new ConversionServiceFactoryBean();
Converter<ZonedDateTime, String> dateTimeConverter =
new Converter<ZonedDateTime, String>() {
@Override
public String convert(ZonedDateTime source) {
return source.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME);
}
};
conversionServiceFactoryBean.setConverters(
new HashSet<>(Arrays.asList(dateTimeConverter)));
return conversionServiceFactoryBean;
}
这很好用。但我的 IDE (IntelliJ) 建议用 lambda 表达式替换匿名内部类:
Converter<ZonedDateTime, String> dateTimeConverter =
source -> source.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME);
如果我这样做了,那么它就不再起作用了,我收到一个关于 Spring 无法确定泛型类型的错误:
Caused by: java.lang.IllegalArgumentException: Unable to the determine sourceType <S> and targetType <T> which your Converter<S, T> converts between; declare these generic types.
at org.springframework.util.Assert.notNull(Assert.java:112)
at org.springframework.core.convert.support.GenericConversionService.addConverter(GenericConversionService.java:100)
at org.springframework.core.convert.support.ConversionServiceFactory.registerConverters(ConversionServiceFactory.java:50)
at org.springframework.context.support.ConversionServiceFactoryBean.afterPropertiesSet(ConversionServiceFactoryBean.java:70)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1627)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1564)
代表 lambda 表达式的 Class 对象显然与匿名内部类的 Class 有很大不同,Spring 无法再确定泛型类型。 Java 8 如何使用 lambda 表达式准确地做到这一点?这是 Spring 中可修复的错误,还是 Java 8 没有提供必要的信息?
我使用的是 Spring 4.1.0.RELEASE 和 Java 8 update 20。
【问题讨论】:
-
谢谢,看来这确实不是一件容易解决的事情。