java JSP TransformerFactory。newInstance()。新变压器(xsl)返回空值?
JavaAPI保证它永远不会返回空值——但对我来说,它是
相关代码:
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是使用新的东西生成的,所以它们必须包含NOTNULL,所以变为null的必须是transformer。为什么会发生这种情况?我如何修复它
抛出这个:
组织。阿帕奇。贾斯珀。jaspereException: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)
编辑:在某种程度上,变压器肯定是空的。观察:
组织。阿帕奇。贾斯珀。jaspereException:JSP中的异常:/dca/ass2/a.JSP:49
46:
47: xml.getInputStream();
48: xsl.getInputStream();
49: transformer.reset();
50:
51: //transformer.transform(xml, result);
52:
这又是一个空指针异常。如果是因为xml为空,那么它将抛出一个NPE值47
EDIT2:如果我将newTransformer(xsl)更改为newTransformer(),它会工作,因此这是newTransformer(xsl)中的一个问题
# 1 楼答案
在传递xml之前,请检查它是否为null/空。我想你会发现它是空的
例如,
new StreamSource(new URL(mondialURL).openStream())
是返回null还是空对象# 2 楼答案
输入流为空
# 3 楼答案
在向项目添加了新的依赖项之后,当我的一些测试出错时,我遇到了同样的问题。我想知道当API说这是不可能的时候,这个返回怎么可能null,我再次修改了它:
所以,我也看了一下TransformerFactoryAPI,它说:
正如我提到的,当我向项目添加一个新的依赖项时,问题就开始了:另一个处理XML文档/签名的项目。我删除了依赖项,运行了测试(添加依赖项失败),并检索了TransformerFactory的特定类。我重新添加了依赖项并再次运行了测试:它现在是一个不同的类。因此,正如我所想,查找过程实例化了一个错误的TransformerFactory实现,在添加的jar中找到了它
我不想通过添加另一个系统属性来修复它,因此我更改了如下代码:
一切都很顺利
# 4 楼答案
This question的答案似乎表明当XSL无效时会发生这种情况,这可以解释我目前遇到的问题
在我们的特定示例中,使用的XML编辑器在文件的第一个位置悄悄插入了一个不可见的字符。打印文件的前几个字节显示了这一点。使用更强大的编辑器,我们从文件中删除了有问题的字节,一切都很好