ColdFusion/Java-“;未找到生成方法";

ColdFusion/Java-“;未找到生成方法";,java,coldfusion,Java,Coldfusion,我们正在使用一些org.apache类作为实现webservice的WS-Security的一部分 variables.paths = arrayNew(1); variables.paths[1] = getDirectoryFromPath(getCurrentTemplatePath()) & "lib\wss4j-1.5.8.jar"; variables.paths[2] = getDirectoryFromPath(getCurrentTemplatePath()) &

我们正在使用一些org.apache类作为实现webservice的WS-Security的一部分

variables.paths = arrayNew(1);
variables.paths[1] = getDirectoryFromPath(getCurrentTemplatePath()) & "lib\wss4j-1.5.8.jar";
variables.paths[2] = getDirectoryFromPath(getCurrentTemplatePath()) & "lib\xmlsec-1.4.2.jar";
variables.loader = createObject("component","lib.javaloader.JavaLoader").init(loadPaths=variables.paths,loadColdFusionClassPath=true);
variables.WSConstantsObj = loader.create("org.apache.ws.security.WSConstants");
variables.messageClass = loader.create("org.apache.ws.security.message.WSSecUsernameToken");
variables.secHeaderClass = loader.create("org.apache.ws.security.message.WSSecHeader");
以下代码:

<cfset var msg = getMessage()>  
<cfset var secHeader = getSecHeader()>
<cfset var env = soapEnv.getDocumentElement()>
<cfset e = msg.build(env.GetOwnerDocument(),secHeader)>
生成一个巨大的结构(太大,此处无法包含),您可以使用它

但是,以下代码:

<cfset var msg = getMessage()>  
<cfset var secHeader = getSecHeader()>
<cfset var env = soapEnv.getDocumentElement()>
<cfset e = msg.build(env.GetOwnerDocument(),secHeader)>
但是Build()方法确实存在,正如第一个屏幕截图中的黄色突出显示所示

错误消息谈到“…使用javacast函数减少歧义”。如果这是问题所在,我将如何应用此解决方案?

不是“build()”不存在,而是您的签名不正确。构建方法的两个参数是:

env.GetOwnerDocument(),secHeader
我们知道secHeader是这个类的

org.apache.ws.security.message.WSSecHeader
org.w3c.dom.Document
因为您的cfdump表明了这一点

这可能意味着“env.GetOwnerDocument”没有返回类的对象

org.apache.ws.security.message.WSSecHeader
org.w3c.dom.Document

它可能返回错误、原语或其他类。实例化envGetOwnerDocumet()并将其转储并检查该类。我认为它把方法签名搞砸了。这是我最好的猜测。

所有的红色都让我眼睛流血:(除了env.GetOwnerDocument()实际返回的内容外,你已经转储了所有内容。你能试试吗?如果出于某种原因返回NULL或意外,它肯定会导致问题等等……你在env.GetOwnerDocument()中使用大写G吗是的,我是,但是把它改成小写没什么区别。我把env.GetOwnerDocument()甩了出去它是一个巨大的嵌套结构,包含大约4个级别的扩展方法。我猜您的一个JAR包含org.w3c.dom.Document的接口类es,或者ColdFusion在它的JAR中也包含的其他东西。您经常会遇到这样的情况:不同的类加载程序以不同的形式加载相同的类定义位置,即使您的类是正确的类型,但定义中有一些来自不同的位置,并被分类为不同的类。请尝试关闭loadColdFusionClassPath选项。您必须从CF的/lib文件夹复制一些JAR,但您将避免可能发生的一些类加载奇怪现象,因为您错过了其他选项评论…看起来Barnyr和jason D已经为您报道了。对不起:)谢谢Mark。Jason回答说org.apache.xerces.dom.DeferredDocumentImpl确实实现了org.w3c.dom.Document。这里提供了我提供的envGetOwnerDocument()转储:是的,我在写了我的评论之后看到了这一点。我想知道它的实施是否正确?在我看来,它仍然是最有可能的候选人。能否直接实例化org.w3c.dom.Document类并使用它?或者你一定要上xerces的课?