2 Stimmen

Kann nicht Java newInstance() aufrufen statt Groovys beim Ausführen von kompiliertem Groovy-Code in Mule ESB

Innerhalb meiner Mule ESB 3.3.0-App, die im eigenständigen Modus läuft, habe ich einen Transformer, der Groovy-Code aufruft, der als Maven-Abhängigkeits-Jar enthalten ist. In meinem Groovy-Code rufe ich ein Java-Objekt auf, das eine newInstance() -Methode hat, wie folgt:

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

Dies führt zu Fehlern in Groovy, weil ich denke, dass versucht wird, die Groovy-erweiterte Class.newInstance() -Methode aufzurufen. Dies tritt nicht auf, wenn es außerhalb von Mule eigenständig läuft (siehe Update unten für eine Beschreibung des Tests). Wie kann ich bewirken, dass die Java-Methode und nicht die Groovy-Methode aufgerufen wird?

Hier ist ein Ausschnitt aus meinem Stack-Trace. Man kann sehen, dass DefaultGroovyMethods.newInstance() aufgerufen wird. Aber ich möchte die javax.xml.transform.TransformerFactory.newInstance(String, ClassLoader) -Methode aufrufen. Wie?

groovy.lang.GroovyRuntimeException: Konstruktor für javax.xml.transform.TransformerFactory(java.lang.String, null) konnte nicht gefunden werden
bei groovy.lang.MetaClassImpl.invokeConstructor(MetaClassImpl.java:1459)
bei groovy.lang.MetaClassImpl.invokeConstructor(MetaClassImpl.java:1375)
bei org.codehaus.groovy.runtime.InvokerHelper.invokeConstructorOf(InvokerHelper.java:824)
bei org.codehaus.groovy.runtime.DefaultGroovyMethods.newInstance(DefaultGroovyMethods.java:18025)

UPDATE: Weitere Informationen zur Laufzeitumgebung. Der Groovy-Code ist als Jar-Datei verpackt und wird von einer Mule ESB-Anwendung aufgerufen. Mule 3.3.0 wird mit groovy-all-1.8.6.jar ausgeliefert.

UPDATE2: Ich habe einige weitere Tests durchgeführt und eine Groovy-Klasse in eine Jar-Datei kompiliert und sie von einem eigenständigen Java-Programm aus aufgerufen, ohne dass dieses Problem auftritt. Dies lässt mich glauben, dass es ein Problem ist, wenn es in der eigenständigen Umgebung von Mule 3.3.0 ausgeführt wird. Ich füge diesem Beitrag ein Mule-Tag hinzu. Hoffentlich kann mir ein Mule-Experte sagen, was hier vor sich geht.

0voto

Jeff Punkte 1538

Mit Hilfe der Groovy-Benutzer-Mailingliste haben wir festgestellt, dass es ein weiteres JAR auf dem Mule-Klassenpfad geben muss, das die Klasse javax.xml.transformer.Transformer bereitstellt. Ich habe diesen Beispielcode hinzugefügt:

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

Und tatsächlich! Mule fügt ihr eigenes XML-API-JAR hinzu.

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

Warum überschreiben Sie das JDK, Mule?

Mein Workaround bestand darin, die Saxon TransformerFactory direkt zu instanziieren. Es ist nicht sehr elegant, aber meine einzige Option.

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X