2

スタンドアロン モードで実行されている Mule ESB 3.3.0 アプリ内には、Maven に依存する jar として含まれている Groovy コードを呼び出すトランスフォーマーがあります。私のグルーヴィーなコードでは、次のように newInstance() 静的メソッドを持つ Java オブジェクトを呼び出しています。

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

Groovy で強化された Class.newInstance() メソッドを呼び出そうとしていると思われるため、Groovy でエラーが発生しています。これは、Mule スタンドアロンの外部で実行している場合には発生しません (テストの説明については、以下の更新を参照してください)。Groovy メソッドではなく Java メソッドを呼び出すにはどうすればよいですか?

これが私のスタックトレースのスニペットです。その呼びかけを見ることができます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 が同梱されています。

更新 2: さらにいくつかのテストを行い、Groovy クラスを jar ファイルにコンパイルして、スタンドアロンの Java プログラムから呼び出しましたが、この問題は発生しませんでした。これは、Mule 3.3.0 スタンドアロン環境から実行されている問題であると私は信じています。この投稿にミュールタグを追加しています。Mule の専門家が何が起こっているのか教えてくれることを願っています。

4

1 に答える 1

0

Groovy ユーザー メーリング リストの助けを借りて、クラスを提供しているミュール クラスパスに別の jar が必要であると判断しましたjavax.xml.transformer.Transformer。このサンプルコードを追加しました:

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()
于 2013-02-08T13:09:52.647 に答える