2010-11-04 79 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