JSP编译问题是由于在运行嵌入式jetty实例时添加JSP的JSTL验证



我已经创建了一个JSP测试框架,但如果我试图将JSP添加到正在运行的服务器中,就会遇到这个问题。项目配置如下:

  1. JSP位于/webapps文件夹下
  2. 我为这个JSP创建了一个ServletHolder调度,并将servlet添加到webcontext中
  3. 我用这个webcontext设置了嵌入式Jetty服务器,并启动了服务器
  4. jsp页面服务良好

现在,我为不同的JSP创建另一个Servlet Holder,并将其添加到运行服务器的webcontext中。在访问页面时,我得到以下异常

java.lang.NullPointerException
at org.apache.taglibs.standard.tlv.JstlBaseTLV.validate(JstlBaseTLV.java:149)
at org.apache.taglibs.standard.tlv.JstlCoreTLV.validate(JstlCoreTLV.java:105)
at org.apache.jasper.compiler.TagLibraryInfoImpl.validate(TagLibraryInfoImpl.java:949)
at org.apache.jasper.compiler.Validator.validateXmlView(Validator.java:1921)
at org.apache.jasper.compiler.Validator.validate(Validator.java:1888)
at org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:223)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:451)
at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:625)
at org.apache.jasper.servlet.JspServletWrapper.loadTagFile(JspServletWrapper.java:280)
at org.apache.jasper.compiler.TagFileProcessor.loadTagFile(TagFileProcessor.java:660)
at org.apache.jasper.compiler.TagFileProcessor.access$000(TagFileProcessor.java:91)
at  org.apache.jasper.compiler.TagFileProcessor$TagFileLoaderVisitor.visit(TagFileProcessor.java:719)
org.apache.jasper.JasperException: PWC6033: Error in Javac compilation for JSP
at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:634)

奇怪的是,如果我停止webcontext并添加servlet并再次启动webcontext,事情就会正常运行。

我尝试调试它,发现对"JstlCoreTLV.getInitParameters()"的第二个jsp/标记调用返回null,可能jstl正在重用以前缓存中的验证对象,并且此属性在其间重置为null。

有人遇到这个问题吗?这会是JSTL库中的一个错误吗?

这里有一个我用来解决这个问题的解决方法-重新初始化默认的JSP servlet以使其taglib缓存无效

    ServletHolder jspServletHolder = webContext.getServletHandler()
                .getServlet("jsp");
Servlet jspServlet = jspServletHolder.getServlet();
ServletConfig jspServletConfig = jspServlet.getServletConfig();
jspServlet.destroy();
jspServlet.init(jspServletConfig);

最新更新