質問

Spring Dataにorg.joda.time.DateTime->java.util.Dateコンバータが見つからないことに問題を解決しました(JODA-TIMEがクラスパスにある場合はデフォルトで有効にする必要があります)。私は理由を見つけましたが、それは春の@Configuration注釈に関する質問を生み出しました。

Spring-Data-MongoDBからのAbstractMongoConfigurationを使用した標準アプリケーション設定:

@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のClassesによって(@ContextConfigurationregister()メソッド)、コンテキストクラスにAnnotationConfigWebApplicationContextを使用する必要はありません。クラスはとにかく処理され、宣言されたすべてのBeanが見つかりました。異なるテストで使用されるテストコンテキストで同じパッケージ内に2類のコンフィギュレーションクラスがある場合、コンポーネントスキャンによる検出を防ぐために@Configurationを使用しないことがある場合があります。

そのため、一般的な内部Beanの処理に応じて、コンテキスト内で異なる内部Bean処理を引き起こす可能性があると思います。私はこれら2つのケースからの春の丸太を比較し、いくつかの違いがありますが、私はSpring内部クラスで彼らが原因であるものを決定することはできません。バグの提出の前に私は尋ねたいです:

私の質問。は、同じ設定クラスのSpring(@Configurationの指摘)がJoda-Timeのコンバータを使用する(またはNOT)、@ContextConfiguration注釈の存在に応じて変換器を使用する(または)。

私は QuickStart Project 問題を再現します。 Spring-Data-MongoDB 1.3.3、Spring 4.0.0、Joda-Time 2.3。

役に立ちましたか?

解決

この動作ではすべて大丈夫です。AbstractMongoConfiguration@Configurationによって注釈を付けられますが、実際、この注釈は@Inheritedではないため、クラスに明示的に注釈を付ける必要があります。

@Configurationアノテーションを削除すると、AppConfigクラスは full 設定ではありません。@Beanで注釈付きメソッドが含まれているため、 lite 設定としてプロセスです - org.springframework.context.annotation.ConfigurationClassUtils

のメソッドを参照してください。

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

最後に full @Configurationによって注釈付き)設定クラスはプロセスクラスです.fencation postプロセッサによって拡張されています - ConfigurationClassPostProcessor.enhanceConfigurationClasses()

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top