java API保证它永远不会返回null - 但对我来说,它是!
相关代码:
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)中的一个问题。
答案 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或空对象?