2017-01-20 10 views
3

Я пытаюсь использовать автоматическое обнаружение как часть EWS-JAVA-API в Coldfusion. Проблема заключается в том, что для метода AutodiscoverUrl один из аргументов должен быть методом обратного вызова. Я понял, что могу использовать динамический прокси-метод Coldfusions для достижения этого, но у меня возникают проблемы с его работой.Использование Autodiscovery (EWS API) с Coldfusion

Java-код, который я пытаюсь преобразовать Coldfusion выглядит следующим образом:

static class RedirectionUrlCallback implements IAutodiscoverRedirectionUrl { 
    public boolean autodiscoverRedirectionUrlValidationCallback(String redirectionUrl) { 
    return redirectionUrl.toLowerCase().startsWith("https://"); 
    } 
} 
service.autodiscoverUrl("<your_email_address>", new RedirectionUrlCallback()); 

Эквивалентный код, который я написал:

<cfset emailAddress = "" > 
<cfset password = "" > 
<cfset server_domain = "outlook.office365.com" > 

<cfset Version = createObject("java", "microsoft.exchange.webservices.data.ExchangeVersion") > 
<!--- Create instance of the MS Exchange Service ---> 
<cfset ExchangeService = CreateObject("java","microsoft.exchange.webservices.data.ExchangeService").init(Version.Exchange2010_SP1) > 

<!--- Create instance of and set the credentials ---> 
<cfset Credentials = CreateObject("java","microsoft.exchange.webservices.data.WebCredentials") > 
<cfset Credentials.init(emailAddress, password) > 
<cfset ExchangeService.setCredentials(Credentials) > 

<cfset dynamicProxy = createDynamicProxy("autodiscoverRedirectProxy", ["microsoft.exchange.webservices.data.autodiscover.IAutodiscoverRedirectionUrl"]) > 
<cfset validateRedirectionUrlCallback = CreateObject("java","microsoft.exchange.webservices.data.autodiscover.IAutodiscoverRedirectionUrl").init(dynamicProxy) > 
<cfset ExchangeService.autodiscoverUrl(emailAddress, validateRedirectionUrlCallback) > 

autodiscoverRedirectProxy является CFC-файл, который содержит обратный вызов следующим образом:

<cfcomponent> 
<cffunction 
    name="AutodiscoverRedirectionUrlValidationCallback" 
    access="public" 
    returntype="boolean" 
    hint="This is going to be used as a dynamic proxy. Used for MS Exchange Autodiscover." > 

    <cfargument name="redirectionUrl" type="string" required="true" > 
    <cfset var result = false > <!--- init ---> 
    <cfif left(Arguments.redirectionUrl,8) eq "https://" > 
     <cfset result = true > 
    </cfif> 
    <cfreturn result > 
</cffunction> 
</cfcomponent> 

Я понимаю, что мой код неверен. И из ошибки я возвращаюсь («Невозможно найти конструктор для класса»), я понимаю, почему. Но я в недоумении, в каком направлении я должен взять отсюда, поэтому я прошу некоторых идей.

ответ

1

Update:

CreateObject("java","microsoft.exchange.webservices.data.autodiscover.IAutodiscoverRedirectionUrl").init(dynamicProxy)

Похоже, вы используете example in the docs, которая немного сбивает с толку, потому что она относится к более сложному сценарию, чем обычно. Большая часть этого примера здесь не применима. Не пытайтесь создавать IAutodiscoverRedirectionUrl напрямую. Это то, что делает динамический прокси. Плюс, IAutodiscoverRedirectionUrl интерфейс, у которого нет конструктора. Таким образом, он не может быть создан с init() в любом случае. Вместо этого просто создайте прокси-объект, передав путь к вашему CFC и массив имен интерфейсов. Затем передайте, что прокси-сервер в соответствующий метод:

<cfset callbackProxy = createDynamicProxy("path.to.your.AutodiscoverRedirectProxy" 
    , ["microsoft.exchange.webservices.data.autodiscover.IAutodiscoverRedirectionUrl"]) > 
<cfset ExchangeService.autodiscoverUrl(emailAddress, callbackProxy) > 

Кроме того, некоторые из createObject() путей неверны. Обновленный код фактически вызывает ошибку «Class Not Found» с CF11, поэтому я подозреваю, что вы можете использовать другой код или, возможно, другую версию. Правильные пути для EWS-Java-API-2.0.jar являются:

<cfset Version = createObject("java" 
    , "microsoft.exchange.webservices.data.core.enumeration.misc.ExchangeVersion")> 
<cfset ExchangeService = createObject("java" 
    , "microsoft.exchange.webservices.data.core.ExchangeService").init(Version.Exchange2010_SP1) > 
<cfset Credentials = CreateObject("java" 
    , "microsoft.exchange.webservices.data.credential.WebCredentials") > 

Наконец, убедитесь, что ваша функция подписи соответствует одному в интерфейсе точно - в том числе имя функции. Скимминг API, имя метода должно, вероятно, быть таким длинным глотком: autodiscoverRedirectionUrlValidationCallback. Не уверен, имеет ли значение уровень access, но метод интерфейса - package/protected, тогда как cffunction - public. При необходимости измените.

<cffunction 
    name="autodiscoverRedirectionUrlValidationCallback" 
    access="public" 
    returntype="boolean"> 

    <cfargument name="redirectionUrl" type="string" required="true" > 
.... 
+0

Спасибо за ваши мысли Ли. – Steve

+0

Я пробовал то, что вы предложили, ответ «метод autodiscoverUrl не был найден». Это происходит, когда аргумент метода неверен. Я также попытался вызвать callbackProxy..autodiscoverRedirectionUrlValidationCallback в качестве аргумента, тогда ответ будет «Элемент AUTODISCOVERREDIRECTIONURLVALIDATIONCALLBACK не установлен в DYNAMICPROXY». – Steve

+0

Можете ли вы обновить свой вопрос с помощью полного кода, который вы пытались (включая создание экземпляра javaloader с файловыми путями .jar) и полное сообщение об ошибке? Я хочу посмотреть, могу ли я воспроизвести его в своей среде. – Leigh