我花了一些时间解决失踪问题 org.joda.time.DateTime->java.util.Date Spring Data 中的转换器(当 Joda-Time 位于类路径上时应默认启用)。我找到了一个原因,但它产生了一个关于 @Configuration Spring 中的注释。

标准应用程序配置使用 AbstractMongoConfiguration 来自 spring-data-mongodb:

@Configuration
@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
    }
}

效果很好。但是当 AppConfig 中的 @Configuration 注解为 已删除/评论:

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

测试失败并显示:

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

AFAIK 不需要使用 @Configuration 对于配置类,当它在上下文中显式注册时(通过中的类) @ContextConfiguration 或一个 register() 中的方法 AnnotationConfigWebApplicationContext)。无论如何都会处理这些类并找到所有声明的 bean。有时不使用也是有用的 @Configuration 当不同测试使用的测试上下文中的同一包中有 2 个相似的配置类时,防止组件扫描检测到。

因此,我认为这可能是 Spring 中的一个错误,它会导致上下文中不同的内部 bean 处理,具体取决于使用情况或不是 @Configuration 注解。我比较了这两种情况的 Spring 日志,发现存在一些差异,但我无法确定它们是由 Spring 内部类中的什么引起的。在提交错误之前我想问:

我的问题。 Spring 对于相同的配置类是否有一个可解释的原因(在 @ContextConfiguration)使用(或不使用)Joda-Time 转换器取决于是否存在 @Configuration 注解?

我还创建了一个 快速启动项目 重现该问题。spring-data-mongodb 1.3.3,spring 4.0.0,joda-time 2.3。

有帮助吗?

解决方案

这种行为一切正常。 AbstractMongoConfiguration 注释为 @Configuration, ,但事实上这个注释不是 @Inherited, ,所以你必须显式地注释你的类。

当您删除时 @Configuration 注释然后你的 AppConfig 类不是一个 满的 配置。它的流程为 精简版 配置只是因为它包含注释的方法 @Bean - 请参考方法 org.springframework.context.annotation.ConfigurationClassUtils

  • isFullConfigurationCandidate()
  • isLiteConfigurationCandidate()
  • isFullConfigurationClass()

最后只有 满的 (注释为 @Configuration)配置类是过程并由配置后处理器增强 - 看看 ConfigurationClassPostProcessor.enhanceConfigurationClasses()

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top