Java cfObject,方法名称为CF保留字

时间:2012-07-06 04:05:19

标签: java coldfusion braintree

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

<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正在查看以下文本:是

3 个答案:

答案 0 :(得分:6)

这表示CF编译器中的错误。 CF中没有规则无法定义称为is()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

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

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

然后相应地调整test.cfm:

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

这会导致编译错误:

  

第19行第4行找到无效的CFML构造。

     

ColdFusion正在查看以下文字:

     

     

[...]

     

coldfusion.compiler.ParseException:第19行第4行找到无效的CFML构造。

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

[等]

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

我建议你file a bug。我会投票支持它。

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

答案 1 :(得分:1)

您可以使用Java Reflection API来调用对象上的is()方法。

我还会与Adobe通话,看看他们是否会修复它或提供自己的解决方法。我可以理解不允许定义自己的方法或名为'is'的变量,但尝试在此处调用它应该是安全的。

答案 2 :(得分: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>