2013-07-15 3 views
1

Я использую библиотеку GoCardless Java с ColdFusion, но я получаю следующее исключение:ClassCast исключение при использовании GoCardless библиотеки Java с ColdFusion

com.sun.net.ssl.internal.www.protocol.https. HttpsURLConnectionOldImpl не может быть приведен к javax.net.ssl.HttpsURLConnection

Прочитав this blog post, кажется, что GoCardless написано против javax.net.ssl, но виртуальная машина имеет дело с com.sun.net.ssl.

Сообщение в блоге предлагает исправить эту проблему, установив следующую систему Java свойство:

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

Я являюсь неопытным с изменением параметров виртуальной машины Java и задавались вопросом, если изменения настроек выше, могут вызвать проблемы в других местах, возможно, где нативные методы ColdFusion полагаться на com.sun.net.ssl? Если возможно возникновение проблем, я не могу реально решить проблему, изменив параметр JVM, поскольку у меня есть несколько приложений, работающих на одном экземпляре ColdFusion.

Будет ли другой способ решения этой проблемы? Благодаря!

+0

у меня нет ответа для вас о проблемах/несовместимости. Однако я полагаю, что настройка может повлиять на любой тег или функцию, способную выполнять вызов ssl, например 'cfhttp',' cfdocument' и т. Д. (Очевидно, это повлияет на все приложения, использующие этот jvm). Вы можете проверить документацию, чтобы узнать, предлагает ли API какой-либо механизм для установки/изменения используемого поставщика безопасности по умолчанию (cont'd ...) – Leigh

+0

Некоторые библиотеки предоставляют настраиваемый файл свойств, например стандартный ['security.properties'] (http://download.java.net/jdk6/beta2/docs/technotes/guides/security/jsse/JSSERefGuide.html). Вы также можете оставить комментарий автора в блоге. Спросите, есть ли у них какие-либо проблемы. Стоит сделать снимок ... – Leigh

+1

Сноска: теперь доступна [клиентская библиотека CFML для GoKerless] (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.Я думаю, что значение свойства фактически считывается из флага jvm в OP. Либо это, либо поставщик с наивысшим приоритетом от 'security.properties'. Таким образом, все три способа установки провайдера являются системными. AFAIK, он не может быть изменен для каждого сеанса/приложения, если библиотека не предоставляет механизм для этого. – Leigh

+0

@Leigh - Да, я понимаю, что это система широкая (отсюда и моя оговорка). Я действительно отвечал на вопрос, который OP опубликовал на другом блоге. А именно, можете ли вы изменить настройку, а затем изменить ее. Я попытался довести это до света в своем ответе, но думаю, что я потерпел неудачу ... –

+1

Miguel-F: Нет, мой плохой. * Ты * был ясен. Я был немного отвлечен, и когда я просмотрел и ответил :-) Я должен был добавить, что он все еще рискован *, потому что * это свойство System wide. По-прежнему существует потенциал повлиять на другие приложения на jvm, потому что [нет гарантии *, когда он будет прочитан] (https://weblogs.java.net/blog/garysweaver/archive/2008/08/javaprotocolhan_1.html). Это делает меня менее удобным. (Вот почему я не предлагал его в комментариях). – Leigh

Смежные вопросы