web-dev-qa-db-ja.com

Springブート2.1.0スターター構成でspring.main.allow-bean-definition-overridingをtrueに設定する方法

たとえば、不明なエンドポイントが呼び出されたときに返されるエラー属性をカスタマイズするspring-boot-starterを保守しています。これは、org.springframework.boot.web.servlet.error.ErrorAttributes Beanをオーバーライドすることにより行われます。

すべてが2.0.6で正常に機能しましたが、 2.1.0はデフォルトでBeanのオーバーライドを無効にします で、スターターは次のメッセージで失敗します。

クラスパスリソース[com/mycompany/springboot/starter/config/ErrorsConfig.class]で定義された 'errorAttributes'という名前の無効なBean定義:Bean定義を登録できません[ルートBean:クラス[null]; scope =; abstract = false; lazyInit = false; autowireMode = 3; dependencyCheck = 0; autowireCandidate = true; primary = false; factoryBeanName = com.mycompany.springboot.starter.config.ErrorsConfig; factoryMethodName = errorAttributes; initMethodName = null; destroyMethodName =(推定); Bean 'errorAttributes'のクラスパスリソース[com/mycompany/springboot/starter/config/ErrorsConfig.class]]で定義されています:[ルートBean:class [null]; scope =; abstract = false; lazyInit = false; autowireMode = 3; dependencyCheck = 0; autowireCandidate = true; primary = false; factoryBeanName = org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration; factoryMethodName = errorAttributes; initMethodName = null; destroyMethodName =(推定);クラスパスリソース[org/springframework/boot/autoconfigure/web/servlet/error/ErrorMvcAutoConfiguration.class]で定義されています

ドキュメントで説明されているように、spring.main.allow-bean-definition-overridingプロパティをtrueに設定すると、問題が修正されます。私の質問は、スターターでそれを行う方法ですそれは私のスターターに固有です)?

@PropertySource( "classpath:/com/mycompany/starter/application.properties")注釈をそのファイルで定義されたそのプロパティで@Configurationにしようとしましたが、機能しません。

私は何が欠けていますか?構成がそのBeanをオーバーライドできるようにする方法はありますか?

以下に、構成の(簡略化された)ソースコードを示します。

@Configuration
@PropertySource("classpath:/com/mycompany/starter/application.properties")
public class ErrorsConfig {
    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();

    @Bean
    public ErrorAttributes errorAttributes() {
        return new DefaultErrorAttributes() {
            @SuppressWarnings("unchecked")
            @Override
            public Map<String, Object> getErrorAttributes(WebRequest request, boolean includeStackTrace) {
                Map<String, Object> errorAttributes = super.getErrorAttributes(request, includeStackTrace);
                // CustomeError is a (simplified) bean of the error attributes we should return.
                CustomError err = new CustomError("myErrorCode", (String) errorAttributes.get("error"));
                return OBJECT_MAPPER.convertValue(err, Map.class);
            }
        };
    }
}

私のリソースファイルcom/mycompany/starter/application.propertiesには

spring.main.allow-bean-definition-overriding = true

6

Spring BootのErrorAttributes Beanは、ErrorMvcAutoConfigurationによって定義されます。 _@ConditionalOnMissingBean_アノテーションが付けられているため、ErrorAttributes Beanがすでに定義されている場合は、バックオフします。 ErrorsConfigクラスによって定義されたBeanは、BootのErrorAttributes Beanをバックオフさせるのではなくオーバーライドしようとするため、ErrorsConfigクラスはBootのErrorMvcAutoConfigurationクラス。これは、スターターに順序の問題があることを意味します。

自動構成クラスが処理される順序は、_@AutoConfigureBefore_および_@AutoConfigureAfter_を使用して制御できます。 ErrorsConfig自体が_spring.factories_に登録された自動構成クラスであると仮定すると、@AutoConfigureBefore(ErrorMvcAutoConfiguration.class)で注釈を付けることで問題を修正できます。この変更により、ErrorsConfigErrorAttributesが定義する前にErrorMvcAutoConfiguration Beanを定義します。これにより、ブートのErrorsAttribute Beanの自動構成がバックします。オフ。

9
Andy Wilkinson

このコマンドを貼り付けることができます"spring.main.allow-bean-definition-overriding=true"の-​​workspace/project/src/main/resources/applicationpropertiesファイルを編集してコマンドを貼り付け、プロジェクトをデバッグモードで実行します。

1
Sai Kumar Reddy