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

Pat*_*shu 2 java xml xslt jsp

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);
Run Code Online (Sandbox Code Playgroud)

由于 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)
Run Code Online (Sandbox Code Playgroud)

编辑:变压器肯定是空的。手表:

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: 
Run Code Online (Sandbox Code Playgroud)

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

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

Ser*_*lin 5

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

一切都很好。