【问题标题】:Spring boot, JSP file as view not loading when run in IntelliJSpring Boot,JSP 文件作为视图在 IntelliJ 中运行时未加载
【发布时间】:2017-01-17 10:18:39
【问题描述】:

我在 intelliJ 中创建了一个简单的 Spring Boot Web 应用程序。我在 /src/main/resources/templates/ 文件夹中放置了一个简单的 .jsp 文件,其中包含一些基本的 HTML。

我试图在控制器中返回它,但我收到了这个错误;

This application has no explicit mapping for /error, so you are seeing this as a fallback.

Fri Sep 09 10:37:46 BST 2016
There was an unexpected error (type=Not Found, status=404).
No message available

我假设 Spring 无法找到 .jsp 文件,但控制台中没有出现其他错误来给我更多信息。

这是我的简单控制器;

@Controller
@RequestMapping("/test")
public class TestController {

    @RequestMapping("")
    public ModelAndView index() {
        return new ModelAndView("test");
    }

}

我在 application.properties 文件中包含以下内容;

spring.mvc.view.prefix = /templates/
spring.mvc.view.suffix = .jsp

我的 POM 文件包含以下依赖项;

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jersey</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
        </dependency>

我正在使用带有嵌入式 tomcat 的 Spring Boot。

我尝试将 application.properties 中视图的路径更改为; classpath:/templates/ 但这也没有任何区别。

最后,这是我的项目的结构;

运行应用程序时,我只是使用 IntelliJ 中的“运行”选项。

【问题讨论】:

  • 如果我的回答是您的问题的解决方案,那么请在您的问题中添加IntelliJ 标签并将其重命名为“Spring boot,JSP 文件作为视图未在 IntelliJ 中加载” - 这将使这个问题对其他用户更有帮助。
  • /templates != classpath:/templates/ JSP 也不应该在静态资源中,它们应该在 webapp 文件夹中(jsp 文件仅适用于 WAR 打包 afaik)。
  • 如果 jsp 文件确实不能在 JAR 文件中工作,那么这不可能是问题的一部分,并且会导致未来的问题,因为我想将此应用程序打包为 jar。
  • 请看这个答案IntelliJ IDEA solution

标签: spring jsp spring-mvc intellij-idea spring-boot


【解决方案1】:

Spring Boot reference documentation Chapter 27.1.7 Template engines 中有针对 IntelliJ 用户的特殊提示:

IntelliJ IDEA 对类路径的排序取决于您的方式 运行您的应用程序。通过主程序在 IDE 中运行您的应用程序 方法将导致与运行时不同的顺序 使用 Maven 或 Gradle 或其打包的 jar 的应用程序。这个可以 导致 Spring Boot 无法在类路径中找到模板。如果 您受到此问题的影响,您可以在 IDE 首先放置模块的类和资源。或者, 您可以配置模板前缀以搜索每个模板 classpath: classpath*:/templates/上的目录。

【讨论】:

  • 遗憾的是,按照建议将前缀更改为模板目录不起作用。出现同样的错误。
  • 你试过“重新排序”吗?
  • 我使用 Java 和 IntelliJ 的时间不长,我不知道如何重新排序。
  • 这个“提示”毫无用处。哪个前缀?在哪里重新排序?
  • 我对此表示赞成,因为它至少解释了巫毒教。同时,该链接应该有更好的说明如何做它建议的两件事(或指向 intellij 的链接以提供一些提示)。我还没有弄清楚我是否正确地尝试了这两件事。 #moreJavaVoodoo
【解决方案2】:

如果我将 tomcat-embed-jasper 依赖项设为默认范围(未标记为“已提供”),那么一切正常……使用 spring boot 1.5.2 和 idea 2017.1。否则,更改它有点困难 - 如果您在 IDEA 项目结构中更改它,它只会在下次从 maven 或 gradle 更新项目时丢失。我还没有想办法让它发挥作用。

如果您在 IDEA 中使用 Spring runner,事情会变得更加复杂——尽管我建议无论如何。当 IDEA 完全知道您的项目是 Spring 时,事情会变得更好。

【讨论】:

    【解决方案3】:

    以下内容将使应用程序与 IntelliJ 一起工作:

    在 main 下,创建文件夹结构 webapp/WEB-INF/jsps/ - 文件夹结构的最后一部分可以命名为任何名称,但它是 jsps 所在的位置。

    删除属性:

    spring.mvc.view.prefix = /templates/
    spring.mvc.view.suffix = .jsp
    

    从您的 application.properties 文件中,并在 Configuration 类中显式创建一个 InternalResourceViewResolver bean,并在那里设置这些属性。

    这就是你的配置类的样子:

    @Configuration
    @EnableWebMvc
    public class WebMvcConfig {
    
        @Bean
        public InternalResourceViewResolver viewResolver() {
            InternalResourceViewResolver resolver = new InternalResourceViewResolver();
            resolver.setPrefix("/WEB-INF/jsps/");
            resolver.setSuffix(".jsp");
            return resolver;
        }
    }
    

    试一试 - 它应该在 IntelliJ 中工作

    【讨论】:

    • 为什么不使用属性?
    【解决方案4】:

    我最近遇到了以下依赖项的相同情况:-

    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-jasper</artifactId>
        <scope>provided</scope>
    </dependency>
    

    如果我将“范围”更改为“默认”,使用 Intellij 运行应用程序,它可以正常工作。

    但是如果我想将“范围”保持为“提供”,我必须使用命令行(终端)并执行以下操作:-

    mvn clean spring-boot:run
    

    它对我有用。

    【讨论】:

      【解决方案5】:

      经过多次试验,它对我有用。它是两个步骤的组合。

      1) Maven 打包必须设置为'war',然后才将'webapp' 下的所有内容放入目标war 文件中。 如果包装是“jar”,则省略“webapp”目录。

      2) 从 IntelliJ 运行 spring boot 主类不起作用。 使用命令从命令提示符运行应用程序:'mvn spring-boot:run'

      【讨论】:

        【解决方案6】:

        在 IntelliJ 中,您不能将提供的放在 tomcat-embed-jasper 下!

        <dependency>
           <groupId>org.apache.tomcat.embed</groupId>
           <artifactId>tomcat-embed-jasper</artifactId>
        </dependency>
        
        <dependency>
           <groupId>javax.servlet</groupId>
           <artifactId>jstl</artifactId>
        </dependency>
        

        【讨论】:

          【解决方案7】:

          经过多次尝试,我能够解决这个问题:

          在 IntelliJ 2019.02.04,Spring Boot 配置中,选择工作区$MODULE_WRK_DIR

          【讨论】:

            【解决方案8】:

            设置工作目录对我有帮助 --- 默认情况下,它是空的。

            1. 在 Idea 中编辑 Spring Boot 应用程序的配置。

            2. 设置工作目录,如下面的截图所示:

            【讨论】:

              【解决方案9】:

              有点晚了,但这对我有用。 在此路径添加您的 .jsp 文件:

              src/main/resources/META-INF/resources/
              

              如果要配置configure.properties 文件,请在其中添加以下行:

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

              信用:https://www.logicbig.com/tutorials/spring-framework/spring-boot/boot-serve-dynamic.html

              【讨论】:

                【解决方案10】:

                在到处碰头之后,我想出了如何解决这个问题。请记住,我使用的是 Windows 10 机器,IntelliJ 版本是 2021.2.2。步骤如下:

                1. 在 IntelliJ IDE 中点击 Run -> Edit Configurations...
                2. Working Directory 文本字段中输入 %MODULE_WORKING_DIR%,我猜对于 linux 可能是 $MODULE_WORKING_DIR
                3. 点击应用按钮
                4. 点击确定按钮
                5. 运行您的应用程序

                它会起作用的。

                【讨论】:

                  猜你喜欢
                  • 2020-12-22
                  • 2021-03-30
                  • 2018-04-11
                  • 2017-10-04
                  • 1970-01-01
                  • 2019-06-23
                  • 1970-01-01
                  • 2019-02-22
                  • 1970-01-01
                  相关资源
                  最近更新 更多