2

我一直在研究 ColdFusion 中的 Braintree 集成。Braintree 不直接支持 CF,但它们提供了一个 Java 库,到目前为止我所做的一切都运行良好......直到现在。似乎某些对象(尤其是搜索功能)具有无法从 CF 访问的方法,我怀疑这是因为它们是 CF 保留字,例如“is”和“contains”。有没有办法解决这个问题?

<cfscript>
gate = createObject( "java", "com.braintreegateway.BraintreeGateway" ).init(env,merchant.getMerchantAccountId(), merchant.getMerchantAccountPublicSecret(),merchant.getMerchantAccountPrivateSecret());
req = createObject( "java","com.braintreegateway.CustomerSearchRequest").id().is("#user.getUserId()#");
customer = gate.customer().search(req);
</cfscript>

抛出的错误:无效的 CFML 构造 ... ColdFusion 正在查看以下文本:是

4

3 回答 3

6

这表示 CF 编译器中的一个错误。CF 中没有规定不能定义称为is()or的方法this(),实际上在基本情况下调用它们也没有问题。此代码演示:

<!--- Junk.cfc --->
<cfcomponent>
    <cffunction name="is">
        <cfreturn true>
    </cffunction>
    <cffunction name="contains">
        <cfreturn true>
    </cffunction>
</cfcomponent>

<!--- test.cfm --->
<cfset o = new Junk()>

<cfoutput>
    #o.is()#<br />
    #o.contains()#<br />
</cfoutput>

这 - 可以预见 - 输出:

true
true

但是,如果我们向 Junk.cfc 引入一个 init() 方法,我们就会遇到问题,因此:

<cffunction name="init">
    <cfreturn this>
</cffunction>

然后相应地调整 test.cfm :

#o.init().is()#<br />
#o.init().contains()#<br />

这会导致编译器错误:

在第 4 行第 19 列发现无效的 CFML 构造。

ColdFusion 正在查看以下文本:

[...]

Coldfusion.compiler.ParseException:在第 4 行第 19 列发现无效的 CFML 构造。

at coldfusion.compiler.cfml40.generateParseException(cfml40.java:12135)

[ETC]

如果没问题,没有正当理由为什么o.init().is()不应该o.is()是好的。

我建议你提交一个错误。我会投票给它。

作为一种解决方法,如果您使用中间值而不是方法链接,您应该没问题。

于 2012-07-06T07:48:58.450 回答
1

您可能可以使用Java 反射 API来调用对象的 is() 方法。

我还会打电话给 Adob​​e,看看他们是否会修复它或提供他们自己的解决方法。我可以理解不允许定义您自己的方法或名为“is”的变量,但尝试在这里调用它应该是安全的。

于 2012-07-06T04:55:51.153 回答
0

这是解决此问题的方法。至少有一个修复程序可以让您启动并运行。

试试这个代码。

<cfscript>
    //Get our credentials here, this is a custom private function I have, so your mileage may vary
    credentials = getCredentials();

    //Supply the credentials for the gateway    
    gateway = createObject("java", "com.braintreegateway.BraintreeGateway" ).init(credentials.type, credentials.merchantId, credentials.publicKey, credentials.privateKey);

    //Setup the customer search object  
    customerSearch = createObject("java", "com.braintreegateway.CustomerSearchRequest").id();

    //can't chain the methods here for the contains, since it's a reserved word in cf.  lame.
    customerSearchRequest = customerSearch.contains(arguments.customerId);

    //Build the result here
    result = gateway.customer().search(customerSearchRequest);
</cfscript>
于 2013-11-05T22:31:04.950 回答