Чтобы лучше объяснить, что я делаю здесь, я хотел бы быть в состоянии пройти объекты JavaScript в адаптер и он вернуть обновленный объект JavaScript. Похоже, есть два пути. Первое, на что я ответил несколько дней назад, с сериализацией и нессериализацией javascript-объекта. Другой использует класс ScriptableObject. В конце концов я хотел использовать инфраструктуру адаптера, как описано для передачи в объекте javascript. При этом, это то, что адаптер код JS-осущ выглядит следующим образом:
function add2(a) {
return {
result: com.ibm.us.roberso.Calculator.add2(a)
};
В яваскрипте кода клиентского приложения, вызывающем выше адаптер. Обратите внимание, что у меня есть функция для проверки передачи объекта javascript в качестве параметра в инфраструктуру адаптера. Смотрите приведенные ниже invocationData.parameters:
function runAdapterCode2() {
// x+y=z
var jsonObject = { "x": 1, "y" : 2, "z" : "?" };
var invocationData = {
adapter : "CalculatorAdapter",
procedure : 'add2',
parameters : [jsonObject]
};
var options = {
onSuccess : success2,
onFailure : failure,
invocationContext : { 'action' : 'add2 test' }
};
WL.Client.invokeProcedure(invocationData, options);
}
В runAdapterCode2(), пропускается JavaScript Object, как вы бы передать какой-либо параметр в адаптер. Когда worklight пытается выполнить java-метод, он будет искать сигнатуру метода либо для объекта Object, либо для ScriptableObject (а не для NativeObject). Я использовал java-отражение api для проверки передаваемого класса и иерархии. Используя статические методы в ScriptableObject, вы можете запрашивать и изменять значение в объекте. В конце метода вы можете вернуть объект Scriptable. Выполнение этого даст вам объект javascript в поле invocationResults.result. Ниже приведен код java, поддерживающий это. Обратите внимание, что хороший фрагмент кода является частью расследования того, какой тип объекта действительно передается. В нижней части метода находятся несколько строк, необходимых для работы с объектом javascript.
@SuppressWarnings({ "unused", "rawtypes" })
public static ScriptableObject add2(ScriptableObject obj) {
// code to determine object class being passed in and its heirarchy
String result = "";
Class objClass = obj.getClass();
result = "objClass = " + objClass.getName() + "\r\n";
result += "implements=";
Class[] interfaces = objClass.getInterfaces();
for (Class classInterface : interfaces) {
result += " " + classInterface.getName() ;
}
result += "\r\nsuperclasses=";
Class superClass = objClass.getSuperclass();
while(superClass != null) {
result += " " + superClass.getName();
superClass = superClass.getSuperclass();
}
// actual code working with the javascript object
String a = (String) ScriptableObject.getProperty((ScriptableObject)obj, "z");
ScriptableObject.putProperty((ScriptableObject)obj, "z", new Long(3));
return obj;
}
Обратите внимание, что для объекта javascript числовое значение - это Long, а не int. Строки по-прежнему являются строками.
Резюме Есть два способа передать объект javascript, который я нашел до сих пор.
- Преобразование в строку в javascript, передать строку в java и восстановить ее в JSONObject.
- Передайте объект javascript и используйте классы ScriptableObject для управления на стороне java.
Просто передавая его как строку и используя любое из множества библиотек JSON, доступных для Java, вы будете прекрасно: https://github.com/douglascrockford/JSON-java/blob/master/JSONObject.java – Zarathuztra