簡體   English   中英

在Mule ESB中運行編譯的Groovy代碼時,無法調用Java newInstance()而不是Groovy

[英]Cannot call Java newInstance() instead of Groovy's When Running Compiled Groovy Code in Mule ESB

在以獨立模式運行的Mule ESB 3.3.0應用程序內部,我有一個轉換器來調用Groovy代碼,該代碼作為依賴於Maven的jar包含在其中。 在我的常規代碼中,我正在調用一個具有newInstance()靜態方法的Java對象,如下所示:

TransformerFactory.newInstance("net.sf.saxon.TransformerFactoryImpl", null)

這在Groovy中引起錯誤,因為我認為它試圖調用Groovy增強的Class.newInstance()方法。 在Mule獨立環境之外運行時不會發生這種情況(有關測試的說明,請參見下面的更新)。 如何使它稱為Java方法而不是Groovy方法?

這是我的堆棧跟蹤的片段。 您可以看到其調用DefaultGroovyMethods.newInstance() 但是我想改為調用javax.xml.transform.TransformerFactory.newInstance(String, ClassLoader)方法。 怎么樣?

groovy.lang.GroovyRuntimeException: Could not find matching constructor for: javax.xml.transform.TransformerFactory(java.lang.String, null)
at groovy.lang.MetaClassImpl.invokeConstructor(MetaClassImpl.java:1459)
at groovy.lang.MetaClassImpl.invokeConstructor(MetaClassImpl.java:1375)
at org.codehaus.groovy.runtime.InvokerHelper.invokeConstructorOf(InvokerHelper.java:824)
at org.codehaus.groovy.runtime.DefaultGroovyMethods.newInstance(DefaultGroovyMethods.java:18025)

更新:有關運行時環境的更多信息。 Groovy代碼打包為jar文件,並從Mule ESB應用程序調用。 Mule 3.3.0帶有groovy-all-1.8.6.jar。

UPDATE2:我進行了一些進一步的測試,並將Groovy類編譯為jar文件,並從獨立的Java程序中對其進行了調用,但沒有遇到此問題。 這使我相信這是從Mule 3.3.0獨立環境運行的問題。 我在這篇文章中添加了ule子標簽。 希望a子專家能告訴我發生了什么事。

在Groovy用戶郵件列表的幫助下,我們確定在the子類路徑上必須存在另一個提供javax.xml.transformer.Transformer類的jar。 我添加了以下示例代碼:

Class klass = TransformerFactory.class; 
URL location = klass.getResource('/'+klass.getName().replace('.', '/')+".class"); 

果然! Mule正在添加自己的XML API jar。

TranformerFactory JAR: jar:file:/D:/java/mule/mule-standalone-3.3.0/lib/endorsed/xml-apis-1.3.04.jar!/javax/xml/transform/TransformerFactory.class

為什么要覆蓋JDK Mule?

我的解決方法是直接實例化Saxon TransformerFactory。 它不是很優雅,但我唯一的選擇。

tFactory = new net.sf.saxon.TransformerFactoryImpl()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM