Я расширяю класс RequestMappingHandlerMapping, добавляя в него некоторые функции,
, когда добавляю свою конфигурацию, как показано ниже:
@Configuration
public class MyConfig extends DelegatingWebMvcConfiguration {
@Override
@Bean
@Primary
public RequestMappingHandlerMapping requestMappingHandlerMapping() {
return super.requestMappingHandlerMapping();
}
@Override
protected RequestMappingHandlerMapping createRequestMappingHandlerMapping() {
//Here I create my new version RequestMappingHandlerMapping
return new MyNewVersionRequestMappingHandlerMapping();
}
}
public class MyNewVersionRequestMappingHandlerMapping extends RequestMappingHandlerMapping {
@Override
protected RequestCondition<?> getCustomTypeCondition(final Class<?> handlerType) {
// instead of null return my new Condition
return new SomeCustomTypeCondition(handlerType);
}
@Override
protected RequestCondition<?> getCustomMethodCondition(final Method method) {
// instead of null return my new Condition
return new SomeCustomTypeCondition(handlerType);
}
}
, затем запускаю приложение , оно говорит:
The bean 'requestMappingHandlerMapping', defined in class path resource [com/test/MyConfig.class],
could not be registered. A bean with that name has already been defined in class path resource
[org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]
and overriding is disabled.
WebMvcAutoConfiguration.EnableWebMvcConfiguration имеет аннотацию @Configuration и расширяется от DelegatingWebMvcConfiguration:
public class WebMvcAutoConfiguration {
...
@Configuration
public static class EnableWebMvcConfiguration extends DelegatingWebMvcConfiguration implements ResourceLoaderAware {
...
@Bean
@Primary
@Override
public RequestMappingHandlerMapping requestMappingHandlerMapping() {
// I want return my version of RequestMappingHandlerMapping, but how?
return super.requestMappingHandlerMapping();
}
...
Цепочка использования из spring-boot-autoconfigure-2.1.9.RELEASE.jar:
-> META-INF\spring.factories
-> WebMvcAutoConfiguration
-> EnableWebMvcConfiguration
-> DelegatingWebMvcConfiguration.
Итак, при использовании автоконфигурации Spring Boot кодируется использование DelegatingWebMvcConfiguration
. Могу ли я заменить эту версию по умолчанию своей собственной версией?
Конечно, я могу добавить опцию к application.yml
main:
allow-bean-definition-overriding: true
Это работает. Но я хочу избежать этого, потому что эта опция будет скрывать предупреждения о дублировании bean-компонентов.
Итак, вопрос: как это исправить, не добавляя такие опции?