【问题标题】:Spring - Set HandlerMapping PrioritySpring - 设置 HandlerMapping 优先级
【发布时间】:2013-06-26 19:23:28
【问题描述】:

如何在 spring 中设置处理程序映射的优先级以允许资源处理程序在控制器请求映射之前进行映射?

例如这个配置:

@Configuration
@EnableWebMvc
@ComponentScan("org.commons.sandbox")
public class WebConfiguration extends WebMvcConfigurerAdapter {

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

    @Bean
    public ViewResolver viewResolver(){
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setViewClass(JstlView.class);
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".jsp");
        return resolver;
    }
}

使用以下控制器:

@Controller
public class HomeController {

    @RequestMapping("/**")
    public String home(){
        return "home";
    }
}

捕获对“/resources”的请求。所以链接到css文件是jsp返回“home”视图而不是“resources”目录中的实际css文件。我知道这是由于映射“/**”,但我认为有一种方法可以配置映射顺序......有吗?

谢谢!

【问题讨论】:

  • 默认情况下,资源处理程序的优先级已经高于请求映射。您是否尝试过更改您的请求映射并查看它是否有效?

标签: web-applications spring-mvc


【解决方案1】:

嗯,这是我的解决方案……暂时。

我必须直接从WebMvcConfigurationSupport 扩展,而不是使用@EnableWebMvc

这是我更新的配置

@Configuration
@ComponentScan("org.commons.sandbox")
public class WebConfiguration extends WebMvcConfigurationSupport {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry){
        registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
        //just to be clear that this has a priority of 0, this is default anyway
        registry.setOrder(0);
    }

    @Bean
    public ViewResolver viewResolver(){
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setViewClass(JstlView.class);
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".jsp");
        return resolver;
    }

    @Override
    @Bean
    public RequestMappingHandlerMapping requestMappingHandlerMapping() {
        RequestMappingHandlerMapping handler = super.requestMappingHandlerMapping();
            //now i have a handle on the handler i can lower it's priority
            //in the super class implementation this is set to 0 
        handler.setOrder(1);
        return handler;
    }
}

我现在可以将RequestMappingHandlerMapping 的优先级设置为低于资源处理程序的SimpleUrlHandlerMapping,以便它在控制器类有机会之前解决静态资源请求

【讨论】:

    【解决方案2】:

    在我的情况下,我需要 SimpleUrlHandlerMapping 之前 ResourceHandler。 由setOrder() 解决。 Spring Boot 代码:

    @EnableAutoConfiguration
    @Configuration
    @Slf4j
    public class MvcConfiguration extends WebMvcConfigurerAdapter {
    
        @Bean(name = "urlViewController")
        public UrlFilenameViewController getUrlViewController() {
            return new UrlFilenameViewController();
        }
    
        @Bean
        public SimpleUrlHandlerMapping getUrlHandlerMapping() {
            SimpleUrlHandlerMapping handlerMapping = new SimpleUrlHandlerMapping();
            handlerMapping.setMappings(new Properties() {
                {
                    put("/view/*", "urlViewController");
                }
            });
            handlerMapping.setOrder(Integer.MAX_VALUE - 5);
            return handlerMapping;
        }
    
        @Override
        public void addResourceHandlers(ResourceHandlerRegistry registry) {
            registry.addResourceHandler("/static/**").addResourceLocations("file:./resources/static/");
            ....
            registry.setOrder(Integer.MAX_VALUE);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-15
      • 2013-08-27
      • 1970-01-01
      • 1970-01-01
      • 2014-10-27
      • 1970-01-01
      • 2012-12-07
      • 2014-10-28
      相关资源
      最近更新 更多