RequestMappingHandlerMapping和WebMvcConfigurerAdapter

时间:2017-02-03 15:26:53

标签: spring spring-mvc spring-boot

我使用Spring Boot。

我有一个使用RequestMappingHandlerMapping注入其中的类。

class Foo {
    private final RequestMappingHandlerMapping mapping;

    Foo(RequestMappingHandlerMapping mapping) {
      this.mapping = mapping;
    }
}

我有一个配置,将Foo和RequestMappingHandlerMapping作为bean进行吐出。

@Configuration
class Bar extends RepositoryRestMvcConfiguration {

    @Bean
    public Foo foo(){
       return new Foo(requestMappingHandlerMapping());
    }

    @Bean
    public RequestMappingHandlerMapping requestMappingHandlerMapping(){
       return new RequestMappingHandlerMapping();
    }
}

最后我还有一个扩展WebMvcConfigurerAdapter的类。

@Configuration
class Baz extends WebMvcConfigurerAdapter {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(<some interceptor>).addPathPatterns(URL_PATTERN);
    }
}

我注意到,由于RequestMappingHandlerMapping,我的拦截器 被注册。当我注释掉RequestMappingHandlerMapping或者当我更改Baz以便它扩展WebMvcConfigurationSupport时,我的拦截器被注册。

不确定是什么导致这种情况。因此,扩展WebMvcConfigurerAdapter的RepositoryRestMvcConfiguration的超类也没有注册。有人可以通过解释这种行为的原因来帮助我吗?

我还注意到,如果我将@EnableWebMvc放在拦截器注册的Baz类中,那么它会被注册。但不幸的是,对控制器的任何POST请求都返回415而不是201.我的控制器用@RestController注释并使用媒体类型hal + json。

1 个答案:

答案 0 :(得分:0)

我能够解决由@EnableWebMv引起的部分问题导致POST返回415而不是201

@Configuration
class Baz extends WebMvcConfigurerAdapter {

   @Override
   public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(<some interceptor>).addPathPatterns(URL_PATTERN);
   }

   @Override
   public void configureMessageConverters(List<HttpMessageConverter<?>>converters) {
   converters.add(new MappingJackson2HttpMessageConverter());
   }
}

看起来现在一切都已到位:RequestMappingHandlerMapping被拾取并且拦截器也被正确注册。