java - Spring Data MongoDB 默认情况下未启用 Joda-Time 转换器

标签 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
    }
}

Spring Data MongoDB 中的 Joda-Time 转换器(以及 Spring Core 本身)应该由 default 启用当 Joda-Time jar 位于类路径上时。不幸的是我的测试失败了:

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 转换器?

最佳答案

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

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

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

它工作得很好。

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

关于java - Spring Data MongoDB 默认情况下未启用 Joda-Time 转换器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21034351/

相关文章:

java - 带有 Couchbase 服务的 Spring WebMVC - 没有可用的名为 'couchbaseRepositoryOperationsMapping' 的 bean

java - JodaTime 给出的错误结果

java - 在 Joda-Time DateTime 中添加一天

java - 从 LocalDateTime 和 LocalTime 创建一个新的 LocalDateTime

java - glNormal3f 和 glNormalPointer 之间的区别

java - java jdbc连接过多

spring - 在 Spring Boot 2 中,是否可以自动生成具有唯一约束的 JoinTable?

java - 嵌入式 h2 数据库未运行

java - 更改Eclipse Gradle设置

java - 尽管按下后退按钮,但 Activity 仍在后台运行