Как переопределить Spring Boot RequestMappingHandlerMapping? - PullRequest
1 голос
/ 19 января 2020

Я расширяю класс 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-компонентов.

Итак, вопрос: как это исправить, не добавляя такие опции?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...