2013-07-15 17 views
1

我使用在ColdFusion的GoCardless Java庫,但我得到以下異常時:ClassCast例外使用GoCardless Java庫使用ColdFusion

com.sun.net.ssl.internal.www.protocol.https。 HttpsURLConnectionOldImpl不能轉換爲javax.net.ssl.HttpsURLConnection中

看了this blog post似乎GoCardless是對的javax.net.ssl編寫的,但是JVM是處理com.sun.net.ssl。

的博客文章建議通過設置下面的Java系統屬性固定的:

-Djava.protocol.handler.pkgs=javax.net.ssl 

我初出茅廬不斷變化的JVM設置,並想知道如果更改上述設置可能在其他地方造成的問題,也許這裏本地的ColdFusion方法依賴在com.sun.net.ssl上?如果可能會出現問題,那麼我不能通過更改JVM設置來實際解決問題,因爲我有幾個應用程序在同一個ColdFusion實例上運行。

會有其他解決此問題的方法嗎?謝謝!

+0

我沒有要爲大家介紹的問題/不兼容的答案。不過,我想這個設置會影響任何能夠進行ssl調用的標籤或函數,例如'cfhttp','cfdocument'等等。 (顯然它會影響所有使用該jvm的應用程序)。您可以查看文檔以查看API是否提供了用於設置/更改所使用的默認安全提供程序的任何機制(續...) – Leigh

+0

某些庫提供了自定義屬性文件,如標準['security.properties']( http://download.java.net/jdk6/beta2/docs/technotes/guides/security/jsse/JSSERefGuide.html)。您也可以將博客條目的作者留下評論。詢問他們是否遇到任何問題。值得一試...... – Leigh

+1

腳註:a [用於GoCardless的CFML特定客戶端庫](https://github.com/cfsimplicity/gocardless-cfml)現已發佈。 – CfSimplicity

回答

2

我閱讀了對引用的博客文章的評論。其中你問是否有辦法將-Djava.protocol.handler.pkgs臨時設置爲javax.net.sll,然後將其切換回com.sun.net.ssl.internal.www.protocol。我相信有。

免責聲明 - 我沒有嘗試過這一點,但我不確定其後果。例如,在更改此設置時,可能會同時運行多個請求。

閱讀此篇 - You can set Java system properties via ColdFusion

所以,從理論上說,你可以更改設置,如下所示:

<cfset sys = createObject("java", "java.lang.System")> 
<cfset sys.setProperty("java.protocol.handler.pkgs", "javax.net.ssl")> 

然後改回(見下面的例子來檢索當前設置):

<cfset sys = createObject("java", "java.lang.System")> 
<cfset sys.setProperty("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol")> 

您還可以讀取當前系統屬性,如下所示:

<cfset sys = createObject("java", "java.lang.System")> 
<cfoutput>#sys.getProperty("java.protocol.handler.pkgs")#</cfoutput> 

(讀我的ColdFusion 9.0.1服務器上的屬性返回com.sun.net.ssl.internal.www.protocol

+0

Miguel-F - 不幸的是,這也是一個系統屬性。所以它會和jvm標誌有相同的影響。我認爲屬性值實際上是從OP中的jvm標誌中讀取的。無論是那個還是來自'security.properties'的最高優先級提供者。因此,設置提供者的三種方法都是系統範圍的。 AFAIK,它不能在每個會話/應用程序的基礎上進行更改,除非庫提供了這樣做的機制。 – Leigh

+0

@Leigh - 是的,我意識到這是全系統(因此我的聲明)。我真的在回答OP在其他博客文章中發佈的問題。也就是說,您可以更改設置,然後將其更改回去。我試圖把那個光在我的答案,但我想我失敗... –

+1

米格爾-F:不,是我不好。 *你*清晰..我愣了一下,當我脫脂,並回答;-)我應該補充的是,它仍然是有風險的,因爲* *它是一個系統範圍內的屬性。還有影響在JVM上的其他應用程序,因爲[難保* *時,它會讀取(https://weblogs.java.net/blog/garysweaver/archive/2008/08/javaprotocolhan_1.html潛力)。這使我不那麼習慣使用它。 (這就是爲什麼我沒有在評論中提出它的原因)。 – Leigh