私はSpring Boot 1.5.21から2.2.5にアップグレードしています。
MonetaryModule
を使用してREST呼び出しをデシリアライズする必要があり、SpringのObjectMapper
に依存します。
私はいくつかの_@Configuration
_クラスでこのモジュールのそのようなBeanを定義しました(MonetaryModule
はModule
を拡張しています):
_@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
_エンドポイント出力の出力です(投稿自体に貼り付けるには大きすぎます)
状態評価レポートには以下が表示されます。
"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(逆)シリアライゼーションに関するアプリケーションの意見を上書きしないようにしてください。