Как я могу реализовать интерфейс Java от ColdFusion?

Я работаю над приложением ColdFusion для отправки Push-уведомлений через сервис Apple APNS. Я использую Java-библиотеку notnoop apns. Я успешно отправил push-уведомления с помощью этого, но недавно столкнулся с некоторыми проблемами. Я хочу использовать интерфейс ApnsDelegate, который предоставляется для отладки проблемы, но я не знаю, как реализовать интерфейс Java в ColdFusion. Я не программист на Java. Пожалуйста помоги.

Обновление: до сих пор я фактически написал класс Java для реализации интерфейса, но я не могу понять, как "пузырить" события в ColdFusion. Я попытался войти в методы Java (используя log4j), но это тоже не работает.

Мне просто нужен способ захвата при вызове этих java-методов и регистрации некоторой информации из передаваемых аргументов.

1 ответ

(Дополнено комментариями)

Для CF8 это можно сделать с помощью CFCDynamicProxy JavaLoader. Это фантастическая особенность, которую Марк Мандель добавил некоторое время назад. По сути, он позволяет вам использовать CFC, как если бы это был конкретный класс Java. Обратите внимание, это относится только к интерфейсам. (CF10+ содержит разрыв JavaLoader, поэтому функция прокси включена. См. Пример создания динамического прокси.).

Чтобы использовать динамический прокси, просто создайте CFC, который реализует все методы, определенные в интерфейсе. Важно, чтобы сигнатуры функций совпадали с методами в интерфейсе (типы, доступ и т. Д.). Глядя на API, что-то вроде этого должно работать.

<cfcomponent>
    <!--- Note: If the argument is a java class, use type="any" --->
    <cffunction name="connectionClosed" returntype="void" access="package">
        <cfargument name="DeliveryError" type="any" required="true" />
        <cfargument name="MessageIdentifier" type="numeric" required="true" />

        <!--- do stuff here --->       
    </cffunction>   

    <cffunction name="messageSendFailed" returntype="void" access="package"
            hint="Called when the delivery of the message failed for any reason">
        <cfargument name="message" type="any" required="true" />
        <cfargument name="failedError" type="any" required="true" />

        <!--- do stuff here --->       
    </cffunction>   

    <cffunction name="messageSent" returntype="void" access="package"
            hint="Called when message was successfully sent to the Apple servers">
        <cfargument name="message" type="any" required="true" />

        <!--- do stuff here --->       
    </cffunction>   
</cfcomponent>

Затем используйте динамический прокси, чтобы создать его экземпляр. Затем вы можете использовать экземпляр в любом месте, которое ожидает ApnsDelegate объект, как если бы это был конкретный класс, который вы написали в Java.

<cfscript>

   // add the paths of required jars into an array
   paths = [ expandPath("/path/to/cfcdynamicproxy.jar")
            , expandPath("/path/to/the_apns.jar")
           ];

   // MUST load the CF class path in order to use the proxy
   loader = createObject("component", "javaLoader.JavaLoader").init(   
                              loadPaths=paths
                             , loadColdFusionClassPath=true
                       );

   // store "names" of all interfaces the proxy implements
   interfaces = [ "com.notnoop.apns.ApnsDelegate" ];

   // grab reference to proxy class
   proxy = loader.create("com.compoundtheory.coldfusion.cfc.CFCDynamicProxy");

   // finally create the delegate
   delegate = proxy.createInstance( "c:/path/to/YourComponent.cfc"
                          , interfaces );

   // debugging
   writeDump( delegate );

   // .. now pass the delegate into some other java method 
</cfscript>
Другие вопросы по тегам