如何在Spring MVC配置类中添加RequestMappingHandlerMapping和ResourceHandlers

7

我有一个类似于这样的Spring MVC配置类:

@Configuration 
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter{
@Bean
public InternalResourceViewResolver configureInternalResourceViewResolver()   {
    InternalResourceViewResolver resolver = new InternalResourceViewResolver();
    resolver.setPrefix("/WEB-INF/views/");
    resolver.setSuffix(".jsp");
    return resolver;
}

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/resources/**").addResourceLocations(
            "/resources/");
}


}

我有一个问题,关于映射带斜杠的URL,类似于这个。因此我想添加RequestMappingHandlerMapping类,但是根据我在这里得到的指示,我需要扩展WebMvcConfigurationSupport类并实现requestMappingHandlerMapping()方法,但不幸的是我已经扩展了WebMvcConfigurationSupport类用于资源的映射。是否有任何方法可以将请求映射处理程序添加到我的类中? 注意:我正在使用Spring版本3.1.1.RELEASE。
3个回答

10

通过使用WebMvcConfigurationSupport覆盖requestMappingHandlerMapping,可能会关闭您的Spring Boot默认配置。更好的方法是使用WebMvcRegistrations,如下所示:

@Configuration
static class CustomRequestMappingHandlerMapping {

    @Bean
    public WebMvcRegistrationsAdapter webMvcRegistrationsHandlerMapping() {
        return new WebMvcRegistrationsAdapter() {
            @Override
            public RequestMappingHandlerMapping getRequestMappingHandlerMapping() {
                return new MyRequestMappingHandlerMapping();
            }
        };
    }
}

4
对我而言,“WebMvcRegistrations”比“WebMvcRegistrationsAdapter”更有效。 - fedor.belov

9
我没有从你的问题中理解为什么你不能使用 WebMvcConfigurationSupport。如果你提到的 "...不幸的是,我已经扩展了WebMvcConfigurationSupport类来进行资源映射..." 意味着你已经扩展了 WebMvcConfigurerAdapter,你应该知道 WebMvcConfigurationSupport 暴露了完全相同的方法。

无论如何,以下是适用于 Spring MVC 3.1 版本的有效 Java 配置。

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurationSupport {

    @Override
    @Bean
    public RequestMappingHandlerMapping requestMappingHandlerMapping() {
        RequestMappingHandlerMapping hm = super.requestMappingHandlerMapping();
        hm.setUseSuffixPatternMatch(false);
        return hm;
    }

    @Bean
    public InternalResourceViewResolver configureInternalResourceViewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".jsp");
        return resolver;
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/resources/**").addResourceLocations(
                "/resources/");
    }
}

5

从Spring Boot 2.0.0开始,您可以直接使用WebMvcRegistrations。

@Configuration
public class WebMvcConfig  {
    @Bean
    public WebMvcRegistrations webMvcRegistrationsHandlerMapping() {
        return new WebMvcRegistrations() {
            @Override
            public RequestMappingHandlerMapping getRequestMappingHandlerMapping() {
                return new CustomRequestMappingHandlerMapping();
            }
        };
    }
}

我找到了相同的解决方案,太完美了! - Benjamin Lucidarme

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接