Spring-Boot无法在WAR文件中查找JSP页面

nod*_*e42 6 java groovy spring spring-mvc spring-boot

运行spring-boot项目(java -jar /path/to/war.war)时,找不到.jsp文件.

使用@ResponseBody注释的方法可以正常工作.视图解析器提供了JSP页面的正确路径,但找不到它们.该项目有一个配置类,没有web.xml.

配置类:

@Configuration
@EnableAutoConfiguration
@EnableWebMvc
@ComponentScan (basePackages = "org.ghc.security.web")
class ScMain extends WebMvcConfigurerAdapter {


    // SpringBoot BootStrap...
    static void main (String[] args) {
        ApplicationContext ctx = SpringApplication.run (ScMain, args)

        System.out.println("Let's inspect the beans provided by Spring Boot:");

        String[] beanNames = ctx.getBeanDefinitionNames();
        Arrays.sort(beanNames);
        beanNames.each { beanName ->
            System.out.println(beanName);
        }
    }


    @Bean
    InternalResourceViewResolver internalResourceViewResolver () {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver()
        viewResolver.setPrefix("/WEB-INF/jsp/")
        viewResolver.setSuffix(".jsp")
        viewResolver
    }
}
Run Code Online (Sandbox Code Playgroud)

调节器

@Controller
class Running {

    @RequestMapping ("/alive")  // This works fine
    @ResponseBody
    String amIAlive () {
        "ALIVE!"
    }


    @RequestMapping ("/alive/page")  // Path to page resolved, but file not found!
    ModelAndView amIAlivePage () {
        new ModelAndView("alivepage")
    }
}
Run Code Online (Sandbox Code Playgroud)

错误日志

2013-11-25 09:08:28.714 ERROR 1549 --- [tp1945397783-20] org.apache.jasper.servlet.JspServlet:PWC6117:文件"%2FUsers%2Fnode42%2FDevelopment%2Fmock-security-ui%2Fbuild%2Flibs %2Fmock-security-ui-2.06-SNAPSHOT.war%2FWEB-INF%2Fjsp%2Falivepage.jsp"未找到

日志条目中.war文件的路径是正确的,war文件(WEB-INF/jsp/alivepage.jsp)中的路径是正确的.无论是使用Jetty还是Tomcat(以上日志来自Jetty),响应都是一样的.我也尝试过不使用视图解析器,如上所述指定一个,或者通过属性设置视图解析器.我完全陷入困境,因为除了这一个细节之外,所有东西看起来都在起作用.并且控制器中的@ResponseBody注释方法工作正常.

如果有人有任何建议我肯定会欣赏输入!

Adr*_*pez 17

我遇到了同样的问题,在我的情况下,它发生了,因为我在类路径中缺少一个库.

Spring Boot不包含Jasper作为默认值,因此除非您明确包含库,否则JSP呈现不起作用:

对于Gradle:

compile("org.apache.tomcat.embed:tomcat-embed-jasper")
Run Code Online (Sandbox Code Playgroud)

对于Maven:

<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-jasper</artifactId>
    <scope>provided</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)


Dav*_*yer 3

我认为 Spring Boot 中尚未完全支持可执行档案中的 JSP(它在列表中),因此我会尝试首先使用 a) 部署的 WAR 和/或 b) 展开的档案(或运行从 IDE),或从源代码运行。一旦它起作用,您可能仍然需要等待添加完整的 JSP 支持(欢迎贡献),但至少您会知道它是起作用的。您在部署的 WAR(无映射)中看到的错误表明还发生了其他情况。注意Spring Boot中有一个JSP示例JSP 示例- 在一定程度上可以工作(JSP 已解析并呈现)。

编辑:Spring taglibs、JSTL 和 EL 支持似乎在上面的示例中起作用。我刚刚更新它以添加 JSTL 并从 IDE 和作为可执行 WAR 进行测试。