小编典典

使用@EnableWebMvc和WebMvcConfigurerAdapter进行静态资源位置的Spring MVC配置会导致“ forward:”和“ redirect:”问题

spring-boot

我有一个用于网络的Spring Boot问候世界,并对配置有些困惑:

spring版本:1.2.6.RELEASE

我需要提供一些静态内容,因此我决定在一些自定义WebConfig类中重新定义此类内容的源目录(出于研究目的):

Javadoc @EnableWebMvc说:

将此注释添加到@Configuration类中,即可从WebMvcConfigurationSupport 导入Spring 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'

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

其实我有我使用为例来研究生产项目,它既有@EnableWebMvc与WebMvcConfigurerAdapter上WebConfig。


阅读 660

收藏
2020-05-30

共1个答案

小编典典

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

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

添加时@EnableWebMvc,您将关闭所有Spring
Boot的Web自动配置,这将自动
为您配置这样的解析器。通过删除注释,自动配置将再次打开,
自动配置ViewResolver解决了该问题。

2020-05-30