我正在使用一个需要对所有SOAP调用进行签名的API。我已经查看了Java中有关如何使用Java XML数字签名API编程签署SOAP调用的文档。
我一直遇到以下错误java.lang.IllegalArgumentException:找不到匹配的方法:类org.jcp.xml.dsig.internal.dom.DOMXMLSignatureFactory的newCanonicalizationMethod。
我知道问题在于将参数发送到newCanonocalizationMethod。我遵循每个Java的流程,但我仍然遇到这个问题。
这是我的代码。
(let [fac (XMLSignatureFactory/getInstance "DOM")
dm (doto (.. fac (newDigestMethod (DigestMethod/SHA1) nil)))
bk ""
ref (.. fac (newReference bk dm))
cm (CanonicalizationMethod/INCLUSIVE)
c14 C14NMethodParameterSpec
in (.. fac (newCanonicalizationMethod cm c14))])
以下是完整的功能代码:我刚开始为每个网站创建签名部分:http://www.oracle.com/technetwork/articles/javase/dig-signature-api-140772.html
(defn create-signature
[]
(let [fac (XMLSignatureFactory/getInstance "DOM")
dm (doto (.. fac (newDigestMethod (DigestMethod/SHA1) nil)))
bk ""
ref (.. fac (newReference bk dm))
cm CanonicalizationMethod/INCLUSIVE
c14 C14NMethodParameterSpec
si (..
fac
(newSignedInfo
(..
fac
(newCanonicalizationMethod
cm
C14NMethodParameterSpec))
(..
fac
(newSignatureMethod
(SignatureMethod/RSA_SHA1) nil))
(.. java.util.Collections (singletonList ref))))
]
))
如果您在工厂中运行反射,则会将此作为回复:
{:name newCanonicalizationMethod,
:return-type javax.xml.crypto.dsig.CanonicalizationMethod,
:declaring-class
org.jcp.xml.dsig.internal.dom.DOMXMLSignatureFactory,
:parameter-types
[java.lang.String
javax.xml.crypto.dsig.spec.C14NMethodParameterSpec],
:exception-types
[java.security.NoSuchAlgorithmException
java.security.InvalidAlgorithmParameterException],
:flags #{:public}}
答案 0 :(得分:0)
此问题的解决方案是在自定义Java类中生成所有java方法。问题是Java方法正在寻找某种类型的参数。代码说使用(Java类型)null生成它,它不能在Clojure中编译。
我正在使用此网站生成XML签名link。
创建自定义类后,我编译并导入到Clojure项目中。
经验教训:使用某些java类时,最好使用纯Java而不是Java Interop。
答案 1 :(得分:0)
我学到的一个技巧是,如果您想要此Java代码:
fac.newCanonicalizationMethod(CanonicalizationMethod.INCLUSIVE, (C14NMethodParameterSpec) null);
您可以在Clojure中执行此操作:
(let [^C14NMethodParameterSpec c14 nil]
(.newCanonicalizationMethod fac CanonicalizationMethod/INCLUSIVE c14))
我希望这会有所帮助!