web-dev-qa-db-ja.com

Spring Boot 2へのアップデート後にJacksonモジュールが登録されない

私はSpring Boot 1.5.21から2.2.5にアップグレードしています。

MonetaryModuleを使用してREST呼び出しをデシリアライズする必要があり、SpringのObjectMapperに依存します。

私はいくつかの_@Configuration_クラスでこのモジュールのそのようなBeanを定義しました(MonetaryModuleModuleを拡張しています):

_@Bean
public MonetaryModule monetaryModule() {
    return new MonetaryModule();
}
_

作成された_/beans_エンドポイントで確認できます。ただし、実際にはObjectMapperにロードされません。 Springのコードを何度もデバッグして調べた結果、JacksonAutoConfigurationに問題があるという結論に達しました。 JacksonObjectMapperBuilderConfigurationという内部静的クラスがあり、その中に_Jackson2ObjectMapperBuilder_を作成するbeanがあります。作成プロセスでは、最終的にこのコードに到達するcustomize()への呼び出しがあります。

_private void configureModules(Jackson2ObjectMapperBuilder builder) {
    Collection<Module> moduleBeans = getBeans(this.applicationContext, Module.class);
    builder.modulesToInstall(moduleBeans.toArray(new Module[0]));
}
_

このコードはモジュールをObjectMapperにロードする責任があるようです。問題は、この_Jackson2ObjectMapperBuilder_が実際に作成されていないことです。 _/beans_エンドポイントに表示されますが、事実上、ブレークポイントでブレークポイントに到達していません。これは、モジュールがObjectMapperにロードされない理由を説明しています。

問題は、なぜこのコードが呼び出されないのですか?そして、なぜ_/bean_は豆が存在することを示していますか?

編集-条件評価レポートの追加:

_============================
CONDITIONS EVALUATION REPORT
============================


Positive matches:
-----------------

   AopAutoConfiguration matched:
      - @ConditionalOnProperty (spring.aop.auto=true) matched (OnPropertyCondition)

   AopAutoConfiguration.AspectJAutoProxyingConfiguration matched:
      - @ConditionalOnClass found required class 'org.aspectj.weaver.Advice' (OnClassCondition)

   AopAutoConfiguration.AspectJAutoProxyingConfiguration.CglibAutoProxyConfiguration matched:
      - @ConditionalOnProperty (spring.aop.proxy-target-class=true) matched (OnPropertyCondition)

   ConfigServiceBootstrapConfiguration#configServicePropertySource matched:
      - @ConditionalOnProperty (spring.cloud.config.enabled) matched (OnPropertyCondition)
      - @ConditionalOnMissingBean (types: org.springframework.cloud.config.client.ConfigServicePropertySourceLocator; SearchStrategy: all) did not find any beans (OnBeanCondition)

   ConfigServiceBootstrapConfiguration.RetryConfiguration matched:
      - @ConditionalOnClass found required classes 'org.springframework.retry.annotation.Retryable', 'org.aspectj.lang.annotation.Aspect', 'org.springframework.boot.autoconfigure.aop.AopAutoConfiguration' (OnClassCondition)
      - @ConditionalOnProperty (spring.cloud.config.fail-fast) matched (OnPropertyCondition)

   ConfigServiceBootstrapConfiguration.RetryConfiguration#configServerRetryInterceptor matched:
      - @ConditionalOnMissingBean (names: configServerRetryInterceptor; SearchStrategy: all) did not find any beans (OnBeanCondition)

   ConfigurationPropertiesRebinderAutoConfiguration matched:
      - @ConditionalOnBean (types: org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor; SearchStrategy: all) found bean 'org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor' (OnBeanCondition)

   ConfigurationPropertiesRebinderAutoConfiguration#configurationPropertiesBeans matched:
      - @ConditionalOnMissingBean (types: org.springframework.cloud.context.properties.ConfigurationPropertiesBeans; SearchStrategy: current) did not find any beans (OnBeanCondition)

   ConfigurationPropertiesRebinderAutoConfiguration#configurationPropertiesRebinder matched:
      - @ConditionalOnMissingBean (types: org.springframework.cloud.context.properties.ConfigurationPropertiesRebinder; SearchStrategy: current) did not find any beans (OnBeanCondition)

   EncryptionBootstrapConfiguration matched:
      - @ConditionalOnClass found required class 'org.springframework.security.crypto.encrypt.TextEncryptor' (OnClassCondition)

   PropertyPlaceholderAutoConfiguration#propertySourcesPlaceholderConfigurer matched:
      - @ConditionalOnMissingBean (types: org.springframework.context.support.PropertySourcesPlaceholderConfigurer; SearchStrategy: current) did not find any beans (OnBeanCondition)


Negative matches:
-----------------

   AopAutoConfiguration.AspectJAutoProxyingConfiguration.JdkDynamicAutoProxyConfiguration:
      Did not match:
         - @ConditionalOnProperty (spring.aop.proxy-target-class=false) did not find property 'proxy-target-class' (OnPropertyCondition)

   AopAutoConfiguration.ClassProxyingConfiguration:
      Did not match:
         - @ConditionalOnMissingClass found unwanted class 'org.aspectj.weaver.Advice' (OnClassCondition)

   DiscoveryClientConfigServiceBootstrapConfiguration:
      Did not match:
         - @ConditionalOnProperty (spring.cloud.config.discovery.enabled) did not find property 'spring.cloud.config.discovery.enabled' (OnPropertyCondition)

   EncryptionBootstrapConfiguration.RsaEncryptionConfiguration:
      Did not match:
         - Keystore nor key found in Environment (EncryptionBootstrapConfiguration.KeyCondition)
      Matched:
         - @ConditionalOnClass found required class 'org.springframework.security.rsa.crypto.RsaSecretEncryptor' (OnClassCondition)

   EncryptionBootstrapConfiguration.VanillaEncryptionConfiguration:
      Did not match:
         - @ConditionalOnMissingClass found unwanted class 'org.springframework.security.rsa.crypto.RsaSecretEncryptor' (OnClassCondition)


Exclusions:
-----------

    None


Unconditional classes:
----------------------

    None
_

また、添付されているのは_/conditions_および_/beans_エンドポイント出力の出力です(投稿自体に貼り付けるには大きすぎます)

エンドポイント出力

6
Eyal Ringort

状態評価レポートには以下が表示されます。

        "JacksonAutoConfiguration.JacksonObjectMapperConfiguration#jacksonObjectMapper": {
          "notMatched": [
            {
              "condition": "OnBeanCondition",
              "message": "@ConditionalOnMissingBean (types: com.fasterxml.jackson.databind.ObjectMapper; SearchStrategy: all) found beans of type 'com.fasterxml.jackson.databind.ObjectMapper' jacksonBuilder"
            }
          ],
          "matched": []
        },

これは、アプリケーションが問題についてすでに意見を提供しているため、Spring Bootの自動構成条件が後退していることを意味します。ObjectMapperという名前のjacksonBuilder Beanがすでに存在します。これは、アプリケーションまたは使用しているライブラリの構成クラスによって提供されます。

この場合、これは、Beanエンドポイントによって指摘されているように、構成クラスからのものです。

        "jacksonBuilder": {
          "aliases": [],
          "scope": "singleton",
          "type": "com.fasterxml.jackson.databind.ObjectMapper",
          "resource": "class path resource [com/behalf/core/authorization_domain/config/AuthorizationDomainConfiguration.class]",
          "dependencies": []
        },

ここで、このAuthorizationDomainConfigurationのメンテナーと連絡を取り、JSON(逆)シリアライゼーションに関するアプリケーションの意見を上書きしないようにしてください。

1
Brian Clozel