使用 @EnableWebMvc 和 WebMvcConfigurerAdapter 进行静态资源定位的 Spring MVC 配置会导致“转发:”和“重定向:”出现问题

Posted

技术标签:

【中文标题】使用 @EnableWebMvc 和 WebMvcConfigurerAdapter 进行静态资源定位的 Spring MVC 配置会导致“转发:”和“重定向:”出现问题【英文标题】:Spring MVC configuration with @EnableWebMvc and WebMvcConfigurerAdapter for static resources location causes problems with "forward:" and "redirect:" 【发布时间】:2016-05-01 02:08:38 【问题描述】:

我有一个用于 web 的 Spring Boot hello world,但对配置有些困惑:

春季版:1.2.6.RELEASE

我的项目结构:

我需要提供一些静态内容,所以我决定在一些自定义 WebConfig 类中重新定义此类内容的源目录(用于学习目的):

@EnableWebMvc 的 Javadoc 说:

将此注解添加到@Configuration 类会导入 Spring 来自 WebMvcConfigurationSupport 的 MVC 配置

要自定义导入的配置,实现接口 WebMvcConfigurer 或更可能扩展空方法基类 WebMvcConfigurerAdapter 并覆盖单个方法,例如:

于是下一个配置类诞生了:

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter 

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) 
        registry.addResourceHandler("/r/**").addResourceLocations("classpath:/static/r/");
        registry.addResourceHandler("/favicon.ico").addResourceLocations("classpath:/static/r/favicon.ico");
    
    @Override
    public void addViewControllers(ViewControllerRegistry registry) 
        registry.addViewController("/").setViewName("forward:/r/diploma/index.html");
        registry.setOrder(Ordered.HIGHEST_PRECEDENCE);
        super.addViewControllers(registry);
    

如果运行应用程序并尝试访问http://localhost:8080/ 我得到下一个例外:

javax.servlet.ServletException: Could not resolve view with name 'forward:/r/diploma/index.html' in servlet with name 'dispatcherServlet'

但是如果我从我的 WebConfig 中删除 @EnableWebMvc,我会在浏览器中获得我的 index.html。 那么这种行为的原因是什么?

实际上,我有一个生产项目,我以该项目为例进行研究,它在WebConfig 上同时具有@EnableWebMvcWebMvcConfigurerAdapter

【问题讨论】:

【参考方案1】:

您应该添加一个ViewResolver 来解析您在WebConfig 中的视图,如下所示:

@Bean
public InternalResourceViewResolver defaultViewResolver() 
    return new InternalResourceViewResolver();

当您添加@EnableWebMvc 时,您将关闭所有 Spring Boot 的 Web 自动配置,它会自动为您配置此类解析器。去掉注解,自动配置会再次开启,自动配置的ViewResolver解决了问题。

【讨论】:

以上是关于使用 @EnableWebMvc 和 WebMvcConfigurerAdapter 进行静态资源定位的 Spring MVC 配置会导致“转发:”和“重定向:”出现问题的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 不使用配置的 Jackson ObjectMapper 和 @EnableWebMvc

使用 @EnableWebMvc 和 WebMvcConfigurerAdapter 进行静态资源定位的 Spring MVC 配置会导致“转发:”和“重定向:”出现问题

springmvc enablewebmvc注解作用

在spring boot中使用@EnableWebMvc 一定要注意的问题!

无法使用 @EnableWebMvc 配置运行 SPRING BOOT 应用程序

@EnableWebMvc 上的 Spring 条件 bean