Spring数据MongoDB默认情况下没有启用Joda-Time转换器

时间:2014-01-10 00:57:06

标签: java spring jodatime spring-data spring-data-mongodb

我尝试使用Joda-Time的org.joda.time.DateTime字段保存文档。

@Document
public class JodaDoc {

    @Id
    private BigInteger id;

    private String dateAsString;

    private DateTime date;

    public JodaDoc(String dateAsString, DateTime date) {
        this.dateAsString = dateAsString;
        this.date = date;
    }

    public BigInteger getId() { return id; }

    public String getDateAsString() { return dateAsString; }

    public DateTime getDate() { return date; }
}

标准应用程序配置使用spring-data-mongodb中的AbstractMongoConfiguration:

@ComponentScan
@EnableMongoRepositories
public class AppConfig extends AbstractMongoConfiguration { ... }

显式使用AppConfig类的测试(使用Spock,但使用spring-test提供的内部机制):

@ContextConfiguration(classes = AppConfig)
class JodaDocRepositorySpec extends Specification {

    @Autowired
    private JodaDocRepository jodaDocRepository

    def "save document with DateTime"() {
        given:
            def jodaDoc = new JodaDoc(DateTime.now())
        when:
            def savedJodaDoc = jodaDocRepository.save(jodaDoc)
        then:
            savedJodaDoc.id
    }
}
当Joda-Time jar在类路径上时,应该由default启用Spring Data MongoDB(以及Spring Core本身)中的Joda-Time转换器。不幸的是,我的测试失败了:

org.springframework.core.convert.ConverterNotFoundException:
No converter found capable of converting from type org.joda.time.DateTime to type java.util.Date

我尝试添加DefaultFormattingConversionService:

@Bean
public ConversionService conversionService() {
    return new DefaultFormattingConversionService();
}

ConversionServiceFactoryBean和其他一些无效的东西。我无法在StackOverflow上找到答案。

问题即可。为什么Spring Data MongoDB没有看到标准的org.joda.time.DateTime -> java.util.Date转换器?

1 个答案:

答案 0 :(得分:4)

花了我一些时间,我想与其他人分享解决方案。

我创建了一个小型快速入门应用程序,但无法重现该问题。最后我发现问题是我的配置类中缺少@Configuration注释。用:

@Configuration
@ComponentScan
@EnableMongoRepositories
public class AppConfig extends AbstractMongoConfiguration { ... }

它运作正常。

当配置类在上下文中显式注册时(@Configuration中的类或@ContextConfiguration中的register()方法,我经常忽略AnnotationConfigWebApplicationContext)。无论如何都处理了所有已声明的bean。当不同测试使用的测试上下文中的相同包中有2个类似的配置类时,不使用@Configuration来防止组件扫描检测有时很有用。生成了另一个question因为我不确定它是否是一个理想的行为。