17

たとえば、未知のエンドポイントが呼び出されたときに返されるエラー属性をカスタマイズする 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]; スコープ=; 抽象=偽; lazyInit=false; autowireMode=3; 依存関係チェック = 0; autowireCandidate = true; プライマリ = false; factoryBeanName=com.mycompany.springboot.starter.config.ErrorsConfig; factoryMethodName=errorAttributes; initMethodName=null; destroyMethodName=(推測); Bean 'errorAttributes' のクラスパス リソース [com/mycompany/springboot/starter/config/ErrorsConfig.class]] で定義: [ルート Bean: クラス [null]; は既にあります。スコープ=; 抽象=偽; lazyInit=false; autowireMode=3; 依存関係チェック = 0; autowireCandidate = true; プライマリ = 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 に設定すると問題が解決します。私の質問は、スターターでそれを行う方法です(私のスターターに固有のもののために、スターターのユーザーが application.properties ファイルを変更する必要はありません)?

そのファイルで定義されたプロパティを使用して @Configuration に @PropertySource("classpath:/com/mycompany/starter/application.properties") アノテーションを付けようとしましたが、機能しません。

私は何が欠けていますか?その 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

4

2 に答える 2