本文介绍了JSP-TransformerFactory.newInstance().newTransformer(xsl)返回null吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

The java API guarantees that it will never return a null - but for me, it is!

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的转换器.为什么会发生这种情况,我该如何解决?

Since xml, xsl and result were made something using new, they -must- contain not null, so it must be transformer that's becoming null. Why is this happening and how can I fix it?

抛出这个:

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

org.apache.jasper.JasperException: Exception in 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)

绝对是变压器某种程度上为零的情况.观看:

It is DEFINITELY the case that the transformer is null somehow. Watch:

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

org.apache.jasper.JasperException: Exception in 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.

And it's a null pointer exception again. If it was because xml was null then it would have thrown an NPE at 47.

如果我将newTransformer(xsl)更改为newTransformer(),则可以正常工作,因此这是newTransformer(xsl)中的问题.

If I change newTransformer(xsl) to newTransformer() it works, so it's a problem in newTransformer(xsl).

推荐答案

在为项目添加了新的依赖性之后,当我的某些测试出错时,我遇到了同样的问题.想知道当它的API表示不可能时,如何返回 null ,我再次对其进行了修改:

I ran into the same problem, when some of my tests went wrong, after having added a new dependency to the project. Wondering how could this return null when its API says it's impossible, I revised it again:

因此,我也查看了 TransformerFactory API ,它说:

So, I had a look at TransformerFactory API, too, and it says:

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

As I mentioned, the problem started when I added a new dependency to the project: another project that processes XML documents/signatures. I deleted the dependency, ran the test (that failed with the dependency added) and retrieved the specific class of the TransformerFactory. I added the dependency back and ran the test again: it was a different class now. So, as I supposed, the lookup procedure was instantiating a wrong TransformerFactory implementation, finding it in the added jar.

我不想添加其他系统属性来修复它,所以我更改了代码:

I didn't want to fix it adding another system property, so I changed the code like that:

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

一切正常.

这篇关于JSP-TransformerFactory.newInstance().newTransformer(xsl)返回null吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-28 16:44