2

在我的 Mule ESB 3.3.0 应用程序中,以独立模式运行,我有一个调用 Groovy 代码的转换器,该代码作为 maven 相关 jar 包含在内。在我的 groovy 代码中,我正在调用一个具有 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 独立环境运行的问题。我在这篇文章中添加了一个骡子标签。希望Mule专家能告诉我发生了什么。

4

1 回答 1

0

在 Groovy 用户邮件列表的帮助下,我们确定在提供javax.xml.transformer.Transformer该类的 mule 类路径上必须有另一个 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()
于 2013-02-08T13:09:52.647 回答