首页 > 解决方案 > 如何使用 Spring MVC 框架为 Spring Boot 应用程序加载 jsp 页面?我得到空指针异常

问题描述


当我的代码尝试查找和加载 jsp 页面时,我总是得到一个空指针异常。这是一个 Spring Boot 应用程序,我正在尝试使用最新的 Spring MVC 框架。请注意,我将应用程序部署在 jar 中,而不是作为 war 文件。所以我的项目中没有 WEB-APP 文件夹或 web.xml 等。
我在放置 ViewName.jsp 页面的 src/main/resources 下有文件夹“模板”。
以下是我的 Controller java 文件中供您参考的代码片段:

    @RequestMapping(value = "/x")
public String launch(@RequestParam("inputFile") String inputFile, @RequestParam("instance") int instance) {

    try {
        launcher.launch(inputFile, instance);
        LOGGER.info("launch completed, trying to set and load the view now");

    } catch (Exception ex) {
        LOGGER.error("Failed to launch job successfully.", ex);
    }

    ModelAndView mav = new ModelAndView();

    Map<String, String> parameters = new HashMap<>();

    parameters.put("inputFile", inputFile);
    parameters.put("instance", Integer.toString(instance));
    mav.addObject("parameters", parameters);

    LOGGER.info("Before setting mav.setViewname");

    mav.setViewName("ViewName");

    LOGGER.info("After setting mav.setViewname, that means setViewName is good"); //this gets printed in the log

    return "ViewName.jsp";


}

下面是抛出的空指针异常:

错误:org.springframework.boot.web.support.ErrorPageFilter - 由于异常 [null] java.lang.NullPointerException:从请求 [/x] 转发到错误页面:在 weblogic.servlet.internal.ServletResponseImpl.sendContentError(ServletResponseImpl. java:713) ~[weblogic.server.merged.jar:12.1.3.0.0] 在 weblogic.servlet.internal.ServletResponseImpl.sendError(ServletResponseImpl.java:761) ~[weblogic.server.merged.jar:12.1.3.0 .0] 在 weblogic.servlet.internal.ServletResponseImpl.sendError(ServletResponseImpl.java:693) ~[weblogic.server.merged.jar:12.1.3.0.0] 在 org.springframework.boot.web.support.ErrorPageFilter$ErrorWrapperResponse .flushBuffer(ErrorPageFilter.java:315) ~[spring-boot-1.5.9.RELEASE.jar:1.5.9.RELEASE] 在 weblogic.servlet.internal.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:321) ~[weblogic.server.merged.jar:12.1.3.0.0] 在 org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:168) ~[spring-webmvc-4.3.13.RELEASE.jar:4.3.13 .RELEASE] at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:303) ~[spring-webmvc-4.3.13.RELEASE.jar:4.3.13.RELEASE] at org.springframework.web .servlet.DispatcherServlet.render(DispatcherServlet.java:1286) ~[spring-webmvc-4.3.13.RELEASE.jar:4.3.13.RELEASE] at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java: 1041)〜[spring-webmvc-4.3.13.RELEASE.jar:4.3.13.RELEASE]在org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:984)〜[spring-webmvc-4.3.13 .RELEASE.jar:4.3.13.RELEASE] 在 org.springframework.web.servlet.DispatcherServlet。doService(DispatcherServlet.java:901) ~[spring-webmvc-4.3.13.RELEASE.jar:4.3.13.RELEASE] at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) ~[spring -webmvc-4.3.13.RELEASE.jar:4.3.13.RELEASE] 在 org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861) ~[spring-webmvc-4.3.13.RELEASE.jar: 4.3.13.RELEASE] 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:731) ~[weblogic.server.merged.jar:12.1.3.0.0] 在 org.springframework.web.servlet.FrameworkServlet。服务(FrameworkServlet.java:846)~[spring-webmvc-4.3.13.RELEASE.jar:4.3.13.RELEASE] at javax.servlet.http.HttpServlet.service(HttpServlet.java:844)~[weblogic.server .merged.jar:12.1.3.0.0] 在 weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:280)~[weblogic.server.merged.jar:12.1.3.0.0] 在 weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:254)~[weblogic.server.merged.jar:12.1.3.0 .0] 在 weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:136) ~[weblogic.server.merged.jar:12.1.3.0.0] 在 weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java :346) ~[weblogic.server.merged.jar:12.1.3.0.0] 在 weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:25) ~[weblogic.server.merged.jar:12.1.3.0. 0] 在 weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:79) ~[weblogic.server.merged.jar:12.1.3.0.0] 在 org.springframework.boot.web.support.ErrorPageFilter.doFilter( ErrorPageFilter.java:115) [spring-boot-1.5.9.RELEASE.jar:1.5.9.RELEASE] 在 org.springframework.boot.web.support.ErrorPageFilter.access$000(ErrorPageFilter.java:59) [spring-boot-1.5.9.RELEASE.jar:1.5.9.RELEASE] at org.springframework.boot.web.support.ErrorPageFilter $1.doFilterInternal(ErrorPageFilter.java:90) [spring-boot-1.5.9.RELEASE.jar:1.5.9.RELEASE] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring -web-4.3.13.RELEASE.jar:4.3.13.RELEASE] 在 org.springframework.boot.web.support.ErrorPageFilter.doFilter(ErrorPageFilter.java:108) [spring-boot-1.5.9.RELEASE.jar :1.5.9.RELEASE] 在 weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:79) [weblogic.server.merged.jar:12.1.3.0.0] 在 org.springframework.boot.actuate.autoconfigure。 MetricsFilter.doFilterInternal(MetricsFilter.java:106) [spring-boot-actuator-1.5.9.RELEASE.jar:1.5.9。RELEASE] 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.3.13.RELEASE.jar:4.3.13.RELEASE] 在 weblogic.servlet.internal.FilterChainImpl.doFilter (FilterChainImpl.java:79) [weblogic.server.merged.jar:12.1.3.0.0] 在 org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197) [spring-web-4.3.13. RELEASE.jar:4.3.13.RELEASE] 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.3.13.RELEASE.jar:4.3.13.RELEASE] 在 weblogic .servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:79) [weblogic.server.merged.jar:12.1.3.0.0] 在 org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:81) [ spring-web-4.3.13.RELEASE.jar:4.3.13.RELEASE] 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.3.13.RELEASE.jar:4.3.13.RELEASE] 在 weblogic.servlet.internal .FilterChainImpl.doFilter(FilterChainImpl.java:79) [weblogic.server.merged.jar:12.1.3.0.0] at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:108) [spring-web- 4.3.13.RELEASE.jar:4.3.13.RELEASE] 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.3.13.RELEASE.jar:4.3.13。发布] 在 weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:79) [weblogic.server.merged.jar:12.1.3.0.0] 在 org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java :99) [spring-web-4.3.13。RELEASE.jar:4.3.13.RELEASE] 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.3.13.RELEASE.jar:4.3.13.RELEASE] 在 weblogic .servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:79) [weblogic.server.merged.jar:12.1.3.0.0] 在 org.springframework.boot.actuate.trace.WebRequestTraceFilter.doFilterInternal(WebRequestTraceFilter.java:110 ) [spring-boot-actuator-1.5.9.RELEASE.jar:1.5.9.RELEASE] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.3.13. RELEASE.jar:4.3.13.RELEASE] 在 weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:79) [weblogic.server.merged.jar:12.1.3.0.0] 在 org.springframework.boot.web .filter.ApplicationContextHeaderFilter。doFilterInternal(ApplicationContextHeaderFilter.java:55) [spring-boot-1.5.9.RELEASE.jar:1.5.9.RELEASE] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web -4.3.13.RELEASE.jar:4.3.13.RELEASE] 在 weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:79) [weblogic.server.merged.jar:12.1.3.0.0] 在 weblogic。 servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3451) [weblogic.server.merged.jar:12.1.3.0.0] 在 weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3417) [weblogic.server.merged.jar:12.1.3.0.0] 在 weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321) [weblogic.server.merged.jar:12.1.3.0.0] 在weblogic.security。service.SecurityManager.runAs(SecurityManager.java:120) [com.oracle.css.weblogic.security.wls_7.1.0.0.jar:CSS 7.1 0.0] 在 weblogic.servlet.provider.WlsSubjectHandle.run(WlsSubjectHandle.java: 57) [weblogic.server.merged.jar:12.1.3.0.0] 在 weblogic.servlet.internal.WebAppServletContext.doSecuredExecute(WebAppServletContext.java:2280) [weblogic.server.merged.jar:12.1.3.0.0] 在weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2196) [weblogic.server.merged.jar:12.1.3.0.0] 在 weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2174) [weblogic .server.merged.jar:12.1.3.0.0] 在 weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1632) [weblogic.server.merged.jar:12.1.3.0.0] 在 weblogic.servlet。提供者。ContainerSupportProviderImpl$WlsRequestExecutor.run(ContainerSupportProviderImpl.java:256) [weblogic.server.merged.jar:12.1.3.0.0] 在 weblogic.work.ExecuteThread.execute(ExecuteThread.java:311) [weblogic.server.merged.jar :12.1.3.0.0] 在 weblogic.work.ExecuteThread.run(ExecuteThread.java:263) [weblogic.server.merged.jar:12.1.3.0.0]

标签: javaspringspring-mvcjspspring-boot

解决方案


默认情况下,spring boot 不支持 JSP,因此您需要添加如下支持。

在你的添加 tomcat jasper 依赖项pom.xml

<!-- https://mvnrepository.com/artifact/org.apache.tomcat/tomcat-jasper -->
<dependency>
    <groupId>org.apache.tomcat</groupId>
    <artifactId>tomcat-jasper</artifactId>
    <version>8.5.31</version>
</dependency>

**这里version应该和你的spring boot内部tomcat使用的一样(对我来说是8.5.31)

通过添加此依赖项,spring boot 将了解如何将 jsp 转换为 servlet。

jsp 页面应该在 webapp 目录中。我附上了一张关于目录结构和视频链接的图片供您参考,以便逐步配置。

https://www.youtube.com/watch?v=nLbvzF1-vXY

项目目录结构


推荐阅读