2011-09-27 49 views
1

當啓動WebSphere,我得到這個異常:XSLT ClassCastException異常在WebSphere春天時試圖創建一個AnnotationMethodHandlerAdapter上

Could not instantiate bean class [org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter]: 
Constructor threw exception; nested exception is java.lang.ClassCastException: 
com.ibm.xtq.xslt.jaxp.compiler.TransformerFactoryImpl incompatible with 
javax.xml.transform.TransformerFactory 
Caused by: java.lang.ClassCastException: com.ibm.xtq.xslt.jaxp.compiler.TransformerFactoryImpl 
incompatible with javax.xml.transform.TransformerFactory 
    at javax.xml.transform.TransformerFactory.newInstance(Unknown Source) 
    at org.springframework.http.converter.xml.AbstractXmlHttpMessageConverter.<init>(AbstractXmlHttpMessageConverter.java:47) 
    at org.springframework.http.converter.xml.SourceHttpMessageConverter.<init>(SourceHttpMessageConverter.java:45) 
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.<init>(AnnotationMethodHandlerAdapter.java:197) 

這似乎並沒有對我的applicationContext.xml任何豆產生任何影響,但它仍然是奇數。對我來說,這看起來好像IBM類正在泄漏到我的應用程序中。

我該如何解決這個問題?我已經將「訪問內部服務器類」選項設置爲「限制」。

回答

1

這確實是一個類加載的問題,但是這不能改變類加載器的設置來解決。

問題在於xml-apis和javax.xml jar文件是通過一些maven依賴項導入的。

由於我們已經將應用程序的類加載器策略設置爲PARENT_LAST,所以我們從jar文件中從WebApp-Class加載器加載了javax.xml.transform.TransformerFactory。 但是它的實現'com.ibm.xtq.xslt.jaxp.compiler.TransformerFactoryImpl'來自服務器類加載器,這個實例鏈接到JDK/JRE提供的javax.xml.transform.TransformerFactory。

由於類是從不同的來源加載的,因此拋出了ClassCastException。

刪除所有依賴到xml-apis/xerces/javax.xml jars解決了這個問題。 由於這些API現在是JDK的一部分,因此不再需要導入它們。

...如果你想知道爲什麼我對這個問題有如此多的瞭解:我和Aaron一起工作。 ;)

0

我不能說限制,因爲我沒有親身經歷,但我認爲這個問題更多的是與IBM Class Loader。你指的是類是IBM Java實現的TransformerFactory的一部分,我想你可以嘗試以下的一個解決手頭這個問題

  1. 要麼改變服務器類加載器策略爲PARENT_LAST(這樣的類加載器會從應用程序的本地類路徑中找到該類,然後再一直到java的運行時鏈)
  2. 其他選項將查看jaxp.properties文件,我認爲它位於(was_root \ java \ jre \ lib),我只讀了關於這個選項從來沒有實際使用它
0

你爲什麼說IBM類是leakin g到你的應用程序中?

TransformerFactory被要求創建一個newInstance。它遵循一系列步驟來確定使用哪個TransformerFactory。如果沒有指定配置,則只選擇使用默認工廠。

這裏是的TransformerFactory的Javadoc: http://download.oracle.com/javase/1.5.0/docs/api/javax/xml/transform/TransformerFactory.html#newInstance()

什麼操作系統?那是AIX嗎?

http://www.ibm.com/developerworks/java/jdk/aix/j664/sdkguide.aix64.html

看着這個文檔(以上鍊接)的AIX它告訴我,這是默認默認地將Impl:

javax.xml.transform.TransformerFactory的 選擇XSLT處理器。可能的值爲: com.ibm.xtq.xslt.jaxp.compiler.TransformerFactoryImpl 使用XL TXE-J編譯器。該值是默認值。

寄回附加信息,以便我們可以嘗試排除此問題。

HTH Manglu