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

时间:2016-01-24 20:41:32

标签: java spring spring-mvc configuration spring-boot

我有一个针对Web的Spring Boot hello世界,并且对配置感到困惑:

Spring版本:1.2.6.RELEASE

我的项目结构:

enter image description here

我需要提供一些静态内容,因此我决定在某些自定义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。 那么这种行为的原因是什么?

实际上我有一个生产项目,我以其为例进行研究,它同时具有@EnableWebMvc& WebMvcConfigurerAdapter上的WebConfig

1 个答案:

答案 0 :(得分:5)

您应该添加rvm install 2.3.0 rvm use 2.3.0 gem install premailer 以在ViewResolver中解析您的观看次数,如下所示:

WebConfig

当您添加@Bean public InternalResourceViewResolver defaultViewResolver() { return new InternalResourceViewResolver(); } 时,您将关闭所有弹簧启动的网络自动配置,这会自动为您配置这样的解析器。通过删除注释,自动配置将再次打开,自动配置@EnableWebMvc可以解决问题。