问题描述
java API保证它永远不会返回null-但是对我来说,是!
The java API guarantees that it will never return a null - but for me, it is!
相关代码:
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吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!