2013-02-07 24 views
2

在我的Mule ESB 3.3.0應用程序中,以獨立模式運行,我有一個轉換器調用Groovy代碼,作爲依賴Maven的jar包。在我的Groovy代碼,我打電話,有一個的newInstance()靜態方法的Java對象,就像這樣:當在Mule中運行編譯的Groovy代碼時,不能調用Java newInstance()而不是Groovy的調用ESB

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獨立環境運行的問題。我正在爲這篇文章添加一個mule標籤。希望騾子專家能告訴我發生了什麼事。

+0

什麼版本的groovy? –

+0

請參閱上面的更新。它在Grole 1.8.0中隨附的Mule 3.3.0中運行。 – Jeff

回答

0

在Groovy用戶郵件列表的幫助下,我們確定在提供javax.xml.transformer.Transformer類的mule classpath上必須有另一個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()