我正在尝试将Auto Discovery用作Coldfusion中EWS-JAVA-API的一部分。 问题是,AutodiscoverUrl方法要求其中一个参数是回调方法。 我想我可以使用Coldfusions动态代理方法来实现这一点,但是我在使用它时遇到了一些麻烦。
我试图转换为Coldfusion的java代码如下:
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>
我理解我的代码不正确。从错误中我回来(“无法找到类的构造函数”)我理解为什么。 但是我不知道我应该从这里采取哪个方向,所以我要求一些想法。
答案 0 :(得分:1)
<强>更新强>
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()
路径不正确。更新的代码实际上会导致&#34; Class Not Found&#34; 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" >
....