2013-07-15 12 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