0

Web サービスの WS セキュリティの実装の一部として、いくつかの org.apache クラスを使用しています。

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()>

生成:

ここに画像の説明を入力

env.getOwnerDocument()

巨大な構造 (大きすぎてここに含めることはできません) が生成され、ここで表示できます。

ただし、次のコード:

<cfset e = msg.build(env.GetOwnerDocument(),secHeader)>

エラーをスローします:

 The build method was not found.
Either there are no methods with the specified method name and argument types or the build method is overloaded with argument types that ColdFusion cannot decipher reliably. ColdFusion found 0 methods that match the provided arguments. If this is a Java object and you verified that the method exists, use the javacast function to reduce ambiguity.

ただし、最初のスクリーンショットの黄色のハイライトのように、Build() メソッドは確かに存在します。

エラーメッセージは、「...曖昧さを減らすためにjavacast関数を使用してください」について語っています。これが問題である場合、この解決策をどのように適用しますか?

4

1 に答える 1

0

「build()」が存在しないのではなく、署名が間違っているのです。build メソッドの 2 つの引数は次のとおりです。

env.GetOwnerDocument(),secHeader

その secHeader はクラスのものであることがわかっています

org.apache.ws.security.message.WSSecHeader

あなたのcfdumpがそれを示しているからです。

これはおそらく、「env.GetOwnerDocument」がクラスのオブジェクトを返していないことを意味します

org.w3c.dom.Document

エラーまたはプリミティブまたは別のクラスを返している可能性があります。envGetOwnerDocumet() をインスタンス化し、それをダンプしてクラスをチェックします。メソッドのシグネチャを台無しにしていると思います。とにかくそれが私の最善の推測です。

于 2012-08-06T14:14:13.753 に答える