2017-07-28 95 views
0

我正在使用需要對所有SOAP調用進行簽名的API。我已經從Java的文檔中瞭解如何使用Java XML數字簽名API進行編程來簽署SOAP調用。使用Clojure登錄肥皂

我一直遇到以下錯誤java.lang.IllegalArgumentException:沒有找到匹配的方法:newCanonicalizationMethod for class org.jcp.xml.dsig.internal.dom.DOMXMLSignatureFactory。

我知道問題在於將參​​數發送到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

你試過'CanonicalizationMethod/INCLUSIVE' - 即沒有parens? –

+0

@Chris - 我確實嘗試了沒有parens,我仍然得到相同的錯誤。 –

+0

您必須使用錯誤的參數數目調用'newCanonicalizationMethod',或者至少有一個參數的類型錯誤。你可以在你的問題中提供'newCanonicalizationMethod'的簽名嗎? –

回答

0

解決此問題的方法是在自定義Java類中生成所有的java方法。問題是Java方法正在尋找某種類型的參數。該代碼表示​​使用(Java類型)null生成它,它不在Clojure中編譯。

我在用這個網站生成XML簽名link

創建自定義類後,我編譯並導入到Clojure項目中。

經驗教訓:使用某些java類時,最好使用純Java而不是Java Interop。