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

时间:2010-11-04 11:45:33

标签: java xml jsp xslt

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中的异常:/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.JasperException:JSP中的异常:/dca/ass2/a.jsp:49

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

这又是一个空指针异常。如果是因为xml为null,那么它会在47处抛出一个NPE。

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

4 个答案:

答案 0 :(得分:4)

在我为项目添加新的依赖项之后,当我的一些测试出错时,我遇到了同样的问题。想知道当它的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

一切正常。

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

输入流为空。

答案 3 :(得分:0)

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

e.g。是new StreamSource(new URL(mondialURL).openStream())返回null或空对象?