代码之家  ›  专栏  ›  技术社区  ›  Patashu

JSP-TransformerFactory.newInstance().newTransformer(xsl)返回null?

  •  2
  • Patashu  · 技术社区  · 14 年前

    http://download.oracle.com/javase/6/docs/api/javax/xml/transform/TransformerFactory.html#newTransformer(javax.xml.transform.Source )

    xml = new StreamSource(new URL(mondialURL).openStream());
    xsl = new StreamSource(new File("/REMOVED/countriesnofilter.xsl"));
    result = new StreamResult(new PrintWriter(out));
    
    transformer = TransformerFactory.newInstance().newTransformer(xsl);
    transformer.transform(xml, result);
    

    由于xml、xsl和result是用新的方法生成的,所以它们必须包含NOTNULL,所以它必须是变为null的转换器。为什么会发生这种情况?我该如何解决它?

    抛出这个:

    org.apache.jasper.jaspereException:JSP中的异常:/dca/ass2/a。jsp:46

    43:  result = new StreamResult(new PrintWriter(out));
    44:  
    45:  transformer = TransformerFactory.newInstance().newTransformer(xsl);
    46:  transformer.transform(xml, result);
    47: 
    48: %>
    49:  <INPUT TYPE="SUBMIT" VALUE="Get one country">
    
    
    Stacktrace:
     org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:451)
     org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:373)
     org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329)
     org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
     javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
     sun.reflect.GeneratedMethodAccessor50.invoke(Unknown Source)
     sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
     java.lang.reflect.Method.invoke(Method.java:597)
     org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:244)
     java.security.AccessController.doPrivileged(Native Method)
     javax.security.auth.Subject.doAsPrivileged(Subject.java:517)
     org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:276)
     org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:162)
    root cause
    
    java.lang.NullPointerException
     org.apache.jsp.dca.ass2.a_jsp._jspService(a_jsp.java:104)
     org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
     javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
     org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:331)
     org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329)
     org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
     javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
     sun.reflect.GeneratedMethodAccessor50.invoke(Unknown Source)
     sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
     java.lang.reflect.Method.invoke(Method.java:597)
     org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:244)
     java.security.AccessController.doPrivileged(Native Method)
     javax.security.auth.Subject.doAsPrivileged(Subject.java:517)
     org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:276)
     org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:162)
    

    编辑:确实是这样的情况下,变压器是空的。观察:

    org.apache.jasper.jaspereException:JSP中的异常:/dca/ass2/a。jsp:49

    46:     
    47:     xml.getInputStream();
    48:     xsl.getInputStream();
    49:     transformer.reset();
    50:     
    51:     //transformer.transform(xml, result);
    52: 
    

    这又是一个空指针异常。如果是因为xml是空的,那么它将抛出一个NPE值为47。

    4 回复  |  直到 14 年前
        1
  •  4
  •   Shantha Kumara Marco Caltagirone    12 年前

    当我的一些测试出错时,我遇到了同样的问题,在给项目添加了一个新的依赖之后。想知道这怎么会回来 无效的 它的API不可能再修改了:

    确定TransformerFactory实现的查找过程 要加载的类:使用javax.xml.transform.变压器工厂系统 财产。。。[查找顺序]。。。一旦应用程序获得 它可以使用工厂配置的TransformerFactory的引用

    所以,我看了看 TransformerFactory API

    “确定要创建的工厂实现的系统属性名为”javax.xml.transform变压器厂”。这个 属性命名TransformerFactory抽象的具体子类 班级。如果未定义属性,则平台默认值为

    如前所述,当我向项目添加一个新的依赖项时,问题就开始了:另一个处理XML文档/签名的项目。我删除了依赖项,运行了测试(添加了依赖项后失败)并检索了TransformerFactory的特定类。我重新添加了依赖项并再次运行测试:它现在是一个不同的类。所以,正如我所想的,查找过程实例化了一个错误的TransformerFactory实现,在添加的jar中找到了它。

    private static final String TRANSFORMER_FACTORY_CLASS = "com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl";
    
    TransformerFactory factory = TransformerFactory.newInstance(TRANSFORMER_FACTORY_CLASS, null);
    //null for default ClassLoader
    

    一切都很顺利。

        2
  •  2
  •   Community CDub    7 年前

    This question 的答案似乎表明当XSL无效时会发生这种情况,这可以解释我当前遇到的情况。

        3
  •  0
  •   Thorbjørn Ravn Andersen    14 年前

    输入流为空。

        4
  •  0
  •   Martijn Verburg    14 年前

    e、 g.is new StreamSource(new URL(mondialURL).openStream()) 返回空或空对象?