Java cfObject с именами методов, которые являются зарезервированными словами CF

Я работаю над интеграцией Braintree в ColdFusion. 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 просматривал следующий текст: is


person E-Madd    schedule 06.07.2012    source источник


Ответы (3)


Это представляет собой ошибку в компиляторе 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 />

Это вызывает ошибку компилятора:

Недопустимая конструкция CFML обнаружена в строке 4 в столбце 19.

ColdFusion просматривал следующий текст:

is

[...]

coldfusion.compiler.ParseException: Недопустимая конструкция CFML найдена в строке 4 в столбце 19.

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

[так далее]

Нет веской причины, по которой o.init().is() не должно быть в порядке, если o.is() в порядке.

Я рекомендую вам сообщить об ошибке. Я буду голосовать за это.

В качестве обходного пути вы должны использовать промежуточные значения, а не цепочку методов.

person Adam Cameron    schedule 06.07.2012
comment
Да, и промежуточные значения не имели значения. - person E-Madd; 07.07.2012
comment
А? Покажите нам измененный код и точное сообщение об ошибке, пожалуйста. Ваше здоровье. - person Adam Cameron; 07.07.2012

Вероятно, вы можете использовать Java Reflection API для вызова is( ) для вашего объекта.

Я бы также позвонил в Adobe, чтобы узнать, исправят ли они это или предложат свой собственный обходной путь. Я могу понять запрет на определение вашего собственного метода или переменной с именем «is», но попытка вызвать его здесь должна быть безопасной.

person barnyr    schedule 06.07.2012

Вот решение этой проблемы. По крайней мере, исправление, чтобы заставить вас работать.

Попробуйте этот код.

<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>
person Kevin Mansel    schedule 05.11.2013