6

运行 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
    }
}

控制器

@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")
    }
}

错误日志

2013-11-25 09:08:28.714 错误 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 注释方法工作正常。

如果有人有任何建议,我当然会很感激您的意见!

4

5 回答 5

17

我遇到了同样的问题,就我而言,这是因为我在类路径中缺少一个库。

Spring Boot 默认不包含 Jasper,因此除非您明确包含该库,否则 JSP 渲染不起作用:

对于 Gradle:

compile("org.apache.tomcat.embed:tomcat-embed-jasper")

对于 Maven:

<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-jasper</artifactId>
    <scope>provided</scope>
</dependency>
于 2014-09-10T13:26:45.083 回答
3

我不认为 Spring Boot 中完全支持可执行存档中的 JSP(它在列表中),所以我会尝试使其首先与 a) 部署的 WAR 和/或 b) 展开的存档(或正在运行从 IDE),或从源代码运行。一旦它工作了,您可能仍然需要等待添加完整的 JSP 支持(欢迎贡献),但至少您会知道它可以工作。您在已部署的 WAR(无映射)中看到的错误表明还有其他事情发生。请注意,如果您想比较某些东西,Spring Boot 中有一个 JSP 示例- 工作到一定程度(JSP 已解析并呈现)。

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

于 2013-11-26T07:49:56.350 回答
2

我遇到了类似的问题,这是由未映射默认 servlet 引起的。我必须在extends DelegatingWebMvcConfiguration课堂上这样做:

@Override
protected void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
    configurer.enable();
}
于 2013-12-16T01:07:20.953 回答
2

我通过在 Bean 定义中的小修正解决了这个问题。

@Bean
    InternalResourceViewResolver internalResourceViewResolver () {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver()
        viewResolver.setPrefix("WEB-INF/jsp/")
        viewResolver.setSuffix(".jsp")
        return viewResolver;
    }
于 2016-06-09T00:56:27.347 回答
0

我不知道你的 pom.xml 但这似乎类似于这个线程

JSP 文件未在 Spring Boot Web 应用程序中呈现

请尝试将依赖项列表添加到您的 pom 中。

于 2014-08-26T08:11:03.180 回答