たとえば、未知のエンドポイントが呼び出されたときに返されるエラー属性をカスタマイズする 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