たとえば、不明なエンドポイントが呼び出されたときに返されるエラー属性をカスタマイズする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
Spring BootのErrorAttributes
Beanは、ErrorMvcAutoConfiguration
によって定義されます。 _@ConditionalOnMissingBean
_アノテーションが付けられているため、ErrorAttributes
Beanがすでに定義されている場合は、バックオフします。 ErrorsConfig
クラスによって定義されたBeanは、BootのErrorAttributes
Beanをバックオフさせるのではなくオーバーライドしようとするため、ErrorsConfig
クラスはBootのErrorMvcAutoConfiguration
クラス。これは、スターターに順序の問題があることを意味します。
自動構成クラスが処理される順序は、_@AutoConfigureBefore
_および_@AutoConfigureAfter
_を使用して制御できます。 ErrorsConfig
自体が_spring.factories
_に登録された自動構成クラスであると仮定すると、@AutoConfigureBefore(ErrorMvcAutoConfiguration.class)
で注釈を付けることで問題を修正できます。この変更により、ErrorsConfig
はErrorAttributes
が定義する前にErrorMvcAutoConfiguration
Beanを定義します。これにより、ブートのErrorsAttribute
Beanの自動構成がバックします。オフ。
このコマンドを貼り付けることができます"spring.main.allow-bean-definition-overriding=true"
の-workspace/project/src/main/resources/applicationpropertiesファイルを編集してコマンドを貼り付け、プロジェクトをデバッグモードで実行します。