在Clojure签署肥皂

时间:2017-07-28 18:41:08

标签: xml soap clojure

我正在使用一个需要对所有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}}

2 个答案:

答案 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))

我希望这会有所帮助!