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

时间:2012-02-16 21:24:22

标签: jstl jetty

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

  1. JSP位于/ webapps文件夹下。
  2. 我创建一个ServletHolder调度到这个JSP并将servlet添加到webcontext。
  3. 我使用此webcontext设置嵌入式Jetty服务器并启动服务器
  4. jsp页面服务正常。
  5. 现在我为另一个JSP创建另一个ServletHolder并将其添加到正在运行的服务器的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,那么运行正常。

    我试图对此进行调试,发现对于第二个jsp / tag调用'JstlCoreTLV.getInitParameters()'返回null,可能jstl正在重用前一个缓存中的验证对象,并且此属性在两者之间重置为null。

    有没有人遇到过这个问题?它会成为JSTL库中的错误吗?

1 个答案:

答案 0 :(得分:1)

以下是我用来解决此问题的解决方法 - 重新初始化默认的JSP servlet以使其taglib缓存无效

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