【问题标题】:InternalResourceViewResolver not resolving views properlyInternalResourceViewResolver 无法正确解析视图
【发布时间】:2018-11-08 20:34:00
【问题描述】:

我不知道我们在这里做错了什么。我正在尝试设置一个单页 Spring MVC 项目,以便我可以查看相关内容。我有一个屏幕,greeting.html 我正在尝试加载。这是我的控制器类来加载它:

@Controller
public class GreetingController {

    @GetMapping("/greeting")
    public String getGreeeting(@RequestParam(name="name", required=false, defaultValue="World") String name, Model model) {
        model.addAttribute("name", name);

        return "greeting";
    }

}

greeting.html/resources/templates/greeeting.html 中时,这可以正常工作。但是,我希望它位于 WEB-INF 文件夹后面。我试过把它放在WEB-INF/views/greeting.htmlwebapp/WEB-INF/views/greeting.html 中。然后我尝试使用InternalResourceViewResolver,正如我在网上看到的那样:

@Bean
public InternalResourceViewResolver viewResolver() {
    InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
    viewResolver.setPrefix("/WEB-INF/views/");
    viewResolver.setSuffix(".html");

    return viewResolver;
}

据我了解,这应该允许它在我的 WEB-INF 文件夹设置之一后面找到greeting.html。但是,当我转到 localhost:8080/greeting 时,我会在控制台中收到 404 以及以下消息:

WARN 1439 --- [nio-8080-exec-1] o.s.w.s.r.ResourceHttpRequestHandler : Path with "WEB-INF" or "META-INF": [WEB-INF/views/greeting.html]

我完全不知道发生了什么或如何解决它,每个在线教程都做这件事并且没有任何问题,我似乎无法在网上找到任何有同样问题的人。任何指导都会在这里有所帮助。

【问题讨论】:

    标签: spring spring-mvc spring-boot


    【解决方案1】:

    尝试删除 provided 或在 tomcat-embed-jasper 依赖项的范围标记中添加 ${tomcat-embed-jasper.scope}。它对我有帮助。

    【讨论】:

    • 您能否提供额外的背景信息,说明它如何和/或为什么解决问题会提高答案的长期价值。
    【解决方案2】:

    尝试更改扩展 WebMvcConfigurerAdapter 的视图解析器。

    @Configuration
    @ComponentScan(basePackages="...package name...")
    @EnableWebMvc
    
    public class MvcConfiguration extends WebMvcConfigurerAdapter{
    
      @Bean
      public InternalResourceViewResolver viewResolver() {
    
         InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
         viewResolver.setPrefix("/WEB-INF/views/");
         viewResolver.setSuffix(".html");
    
       return viewResolver;
    }
    

    }

    【讨论】:

      【解决方案3】:

      您好,我从您的问题中了解到您正在使用弹簧靴 默认情况下,spring boot 搜索 src/main/resources/templates 文件夹 如果您使用了一些依赖项,例如:

      <dependency> 
          <groupId>org.springframework.boot</groupId> 
          <artifactId>spring-boot-starter-thymeleaf</artifactId> 
      </dependency>
      

      这将默认启用百里香。

      要覆盖你需要的 ViewResolver

      在 Spring Boot 中,您可以在 application.properties 文件中进行此类配置:

      spring.mvc.view.prefix=/WEB-INF/views/
      spring.mvc.view.suffix=.html
      

      或者您可以使用 java config 编写自定义解析器配置:

      @Configuration
      @EnableWebMvc
      @ComponentScan
      public class MvcConfiguration extends WebMvcConfigurerAdapter
      {
          @Override
          public void configureViewResolvers(ViewResolverRegistry registry) {
              InternalResourceViewResolver resolver = new InternalResourceViewResolver();
              resolver.setPrefix("/WEB-INF/views/");
              resolver.setSuffix(".html");
              registry.viewResolver(resolver);
          }
      
          @Override
          public void configureDefaultServletHandling(
                  DefaultServletHandlerConfigurer configurer) {
              configurer.enable();
          }  
       }
      

      我认为这很有帮助

      【讨论】:

      • 我原以为会是这样,但是这些解决方案都不适合我。你能想到任何其他可能导致它仍然在资源文件夹中查找的区域吗?
      • 更新答案请查看
      • @BillL 你是打包成罐子还是战争?你用百里香吗?
      【解决方案4】:

      我尝试了所有解决方案,但使用 Spring Boot 2.* 时出现 404 错误。 对我来说,使用命令“mvn clean spring-boot:run”运行应用程序修复了错误

      【讨论】:

      • 我预感到项目需要清理一下!
      【解决方案5】:

      在您的 pom.xml 中添加以下依赖项。我也遇到了同样的错误,但添加此依赖项后,我可以访问 URL。

          <dependency>
              <groupId>org.apache.tomcat.embed</groupId>
              <artifactId>tomcat-embed-jasper</artifactId>
              <version>9.0.52</version>
          </dependency>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-10-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-01
        • 1970-01-01
        相关资源
        最近更新 更多