2010-11-04 65 views
2

java API保证它永远不会返回null - 但对我来说,它是!JSP - TransformerFactory.newInstance()。newTransformer(xsl)返回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); 

由于XML,XSL和结果用新制作的东西,他们-must-含有不为空,所以它必须是变压器这一点变得无效。为什么会发生这种情况,我该如何解决?

抛出此:

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,那么它会抛出一个NPE 47.

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

+0

为什么你确定NPE由此引起'46:transformer.transform(XML,结果);'行?堆栈跟踪中的行号是否与您提供的列表中的行号匹配? – khachik 2010-11-04 11:52:21

+0

org.apache.jasper.JasperException:JSP中的异常:/dca/ass2/a.jsp:46。 46:transformer.transform(xml,result);.所以NPE是由这条线引起的。 – Patashu 2010-11-04 11:56:32

+0

我有同样的问题:http://stackoverflow.com/questions/7470263/android-xsl-transformation-null-pointer-but-working-on-desktop。您是否找到了解决方案? – gtiwari333 2011-09-20 05:51:50

回答

0

输入流为空。

+0

我可以证实这不是这种情况:org.apache.jasper.JasperException:异常在JSP:/dca/ass2/a.jsp:49 46:\t 47:\t xml.getInputStream(); 48:\t xsl.getInputStream(); 49:\t transformer.reset(); 50:\t 51:\t //transformer.transform(xml,结果); 5235:所以它会抛出异常,因为变换器为空。 – Patashu 2010-11-04 12:15:38

0

在传递它之前检查xml是否为空/空。我想你会发现它是空的。

例如是new StreamSource(new URL(mondialURL).openStream())返回null还是空对象?

1

This question的答案似乎表明这将发生在XSL无效时,这将解释我目前遇到的情况。

在我们的具体情况中,一个静默使用的XML编辑器在文件的第一个位置插入了一个不可见的字符。打印文件的前几个字节显示了这一点。使用更强大的编辑器,我们从文件中删除了有问题的字节,一切都很好。

+0

对我来说是一个SVN更新之后,我没有看到有在xsl冲突,使得无效的XML的XSL – jpprade 2018-01-25 10:52:44

4

我遇到了同样的问题,当我的一些测试出错时,添加了一个新的依赖项后。想知道怎么会这样的回报当它的API说,这是不可能的,我再次修改它。

“获取一个TransformerFactory的新实例,此静态方法创建一个新的工厂实例。此方法使用以下命令 查找程序确定TransformerFactory实现 要加载的类:使用javax.xml.transform.TransformerFactory系统 属性... [查找顺序] ...一旦应用程序获得对TransformerFactory的引用,它可以使用工厂配置 并获取变压器实例。“

所以,我看了一下的TransformerFactory API,也和它说:

” 决定哪些工厂实现创建系统属性名为“javax.xml .transform.TransformerFactory”。这 属性名称TransformerFactory抽象 类的具体子类。如果没有定义的属性,一个平台,默认为是用来 “

正如我所提到的问题,当我添加了一个新的依赖于项目开工:。用于处理XML文档/签名另一个项目中,我删除依赖关系,运行测试(失败时添加了依赖关系)并检索TransformerFactory的特定类。我添加了依赖关系并再次运行测试:现在它是一个不同的类。因此,如我所料,查找程序实例化一个错误的TransformerFactory实现,在添加的罐子找到它。

我并不想解决它增加另一个系统属性,所以我改变了码L IKE说:

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 

,一切工作正常。

+0

您的解决方案帮我解决了一个问题,'TransformerFactory.newInstance()。newTransformer()'导致了'ClassNotFoundException'。我仍然必须明白为什么,因为那段代码在过去是一种魅力。 – MaxArt 2013-03-13 15:57:53

+0

@MaxArt我很高兴它有帮助。由于同样的解决方案适用于您,很可能某些依赖项(一个使用** TransformerFactory **的库,但是不同的实现)已添加到您的项目中,或者您可能只是将现有库更新为较新的版本。 – 2013-03-13 17:18:02

+0

是的,的确,我猜这样的事情,但是......不幸的是,我完全失去了可能发生的事情。 – MaxArt 2013-03-13 20:44:55