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

java API保证它永远不会返回null – 但对我来说,它是!

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是使用new创建的,因此它们必须包含非null,因此它必须是变换器才变为null。 为什么会发生这种情况,我该如何解决?

抛出这个:

org.apache.jasper.JasperException:JSP中的exception:/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:  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.JasperException:JSP中的exception:/dca/ass2/a.jsp:49

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

而且它又是一个空指针exception。 如果是因为xml为null那么它会在47处抛出一个NPE。

EDIT2:如果我将newTransformer(xsl)更改为newTransformer()它可以工作,所以这是newTransformer(xsl)中的一个问题。

在为项目添加了新的依赖项之后,当我的一些测试出错时,我遇到了同样的问题。 想知道当它的API说不可能时,它如何返回null ,我再次修改它:

“获取TransformerFactory的新实例。此静态方法创建一个新的工厂实例。此方法使用以下有序查找过程来确定要加载的TransformerFactory实现类:使用javax.xml.transform.TransformerFactory系统属性。… [查找顺序] …一旦应用程序获得了对TransformerFactory的引用,它就可以使用工厂来配置和获取转换器实例。“

所以,我也看了一下TransformerFactory API ,它说:

“确定要创建哪个Factory实现的系统属性命名为”javax.xml.transform.TransformerFactory“。此属性命名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 

一切都很好。

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

在我们的特定情况下,使用的XML编辑器以静默方式在文件的第一个位置插入一个不可见的字符。 打印文件的前几个字节显示了这一点。 使用更强大的编辑器,我们从文件中删除了有问题的字节,一切都很顺利。

输入流为空。

在传递之前检查xml是否为空/空。 我想你会发现它是空的。

例如, new StreamSource(new URL(mondialURL).openStream())返回null或空对象?