在Coldfusion中使用自动发现(EWS API)

时间:2017-01-20 22:27:21

标签: java coldfusion exchangewebservices

我正在尝试将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>

我理解我的代码不正确。从错误中我回来(“无法找到类的构造函数”)我理解为什么。 但是我不知道我应该从这里采取哪个方向,所以我要求一些想法。

1 个答案:

答案 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" >
....
相关问题