복붙노트

[SPRING] WebMvcConfigurationSupport를 확장하고 WebMvcAutoConfiguration을 사용할 수 있습니까?

SPRING

WebMvcConfigurationSupport를 확장하고 WebMvcAutoConfiguration을 사용할 수 있습니까?

WebMvcConfigurationSupport 클래스를 확장하여 두 가지를 수정해야합니다.

@Configuration
public class WebConfig extends WebMvcConfigurationSupport {
    @Override
    public RequestMappingHandlerMapping requestMappingHandlerMapping() {
        RequestMappingHandlerMapping handlerMapping = super.requestMappingHandlerMapping();
        handlerMapping.setRemoveSemicolonContent(false);
        handlerMapping.setOrder(1);
        return handlerMapping;
    }
}

WebMvcAutoConfiguration 클래스에서 등록 된 기본값이 마음에 들지만 클래스의 조건부 주석으로 인해 WebMvcConfigurationSupport 클래스를 확장하면 자동 구성이 수행되지 않습니다.

@Configuration
@ConditionalOnWebApplication
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class,
    WebMvcConfigurerAdapter.class })
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
@Order(Ordered.HIGHEST_PRECEDENCE + 10)
@AutoConfigureAfter(DispatcherServletAutoConfiguration.class)
public class WebMvcAutoConfiguration {...}

기본적으로 WebMvcAutoConfiguration 클래스를로드하고 해당 클래스의 대부분의 코드를 복사하거나 붙여 넣지 않아도됩니까?

아니면 다른 곳에서 RequestMappingHandlerMapping setOrder () 및 setRemoveSemicolonContent ()를 호출하여 @EnableWebMvc 주석을 사용하고 자동 구성 클래스를 아무 문제없이 실행할 수 있습니까?

미리 감사드립니다!

해결법

  1. ==============================

    1.분석이 정확합니다 (@EnableWebMvc 또는 WebMvcConfigurationSupport를 직접 확장하면 WebMvcAutoConfiguration이 해제됩니다). a) 우리는 autoconfig를위한 "get-out"절이 필요하고 b) Spring은 같은 맥락에서 두 개의 WebMvcConfigurationSupports를 가지고 있다고 생각하지 않는다고 생각합니다. 당신이 그것을 바꿀 수있는 방법을 찾고 싶다면 github에 대해 토론 해 주시면 기쁩니다 (중간 정도의 부분이있을 수 있습니다).

    분석이 정확합니다 (@EnableWebMvc 또는 WebMvcConfigurationSupport를 직접 확장하면 WebMvcAutoConfiguration이 해제됩니다). a) 우리는 autoconfig를위한 "get-out"절이 필요하고 b) Spring은 같은 맥락에서 두 개의 WebMvcConfigurationSupports를 가지고 있다고 생각하지 않는다고 생각합니다. 당신이 그것을 바꿀 수있는 방법을 찾고 싶다면 github에 대해 토론 해 주시면 기쁩니다 (중간 정도의 부분이있을 수 있습니다).

  2. ==============================

    2.BeanPostProcessor를 사용하여 WebMvcAutoConfiguration을 유지하면서 RequestMappingHandlerMapping을 사용자 정의 할 수있었습니다.

    BeanPostProcessor를 사용하여 WebMvcAutoConfiguration을 유지하면서 RequestMappingHandlerMapping을 사용자 정의 할 수있었습니다.

    @Configuration
    public class RequestMappingConfiguration {
        @Bean
        public RequestMappingHandlerMappingPostProcessor requestMappingHandlerMappingPostProcessor() {
            return new RequestMappingHandlerMappingPostProcessor();
        }
    
        public static class RequestMappingHandlerMappingPostProcessor implements BeanPostProcessor {
    
            @Override
            public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
                if (bean instanceof RequestMappingHandlerMapping) {
                    ((RequestMappingHandlerMapping) bean).setUseSuffixPatternMatch(false);
                }
                return bean;
            }
    
            @Override
            public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
                return bean;
            }
        }
    }
    

    Spring Boot가 더 나은 방법을 제공한다면 행복 할 것입니다 ... 아마도 PathMatchConfigurer 주변에서 뭔가를 할 수 있을까요?

  3. ==============================

    3.WebMvcConfigurationSupport 대신 DelegatingWebMvcConfiguration에서 확장하면 자동 구성이 수행되지 않습니다.

    WebMvcConfigurationSupport 대신 DelegatingWebMvcConfiguration에서 확장하면 자동 구성이 수행되지 않습니다.

    @Configuration
    public class WebConfig extends DelegatingWebMvcConfiguration {
        @Override
        public RequestMappingHandlerMapping requestMappingHandlerMapping() {
            RequestMappingHandlerMapping handlerMapping = super.requestMappingHandlerMapping();
            handlerMapping.setRemoveSemicolonContent(false);
            handlerMapping.setOrder(1);
            return handlerMapping;
        }
    }
    
  4. ==============================

    4.지금 봄 부팅에서이 작업을 수행하는 가장 좋은 방법은 컨텍스트에 WebMvcRegistrations 구성 요소를 추가하는 것입니다.이 솔루션은 질문 시점에 존재하지 않았습니다 (스프링 부트 1.4.0부터 사용 가능).

    지금 봄 부팅에서이 작업을 수행하는 가장 좋은 방법은 컨텍스트에 WebMvcRegistrations 구성 요소를 추가하는 것입니다.이 솔루션은 질문 시점에 존재하지 않았습니다 (스프링 부트 1.4.0부터 사용 가능).

  5. from https://stackoverflow.com/questions/22267191/is-it-possible-to-extend-webmvcconfigurationsupport-and-use-webmvcautoconfigurat by cc-by-sa and MIT license