为了更好地解释我在这里做什么,我希望能够为JavaScript对象传递到适配器并使其返回一个更新的JavaScript对象。看起来有两种方式。第一个是我在几天前回答了序列化和反序列化javascript对象的问题。另一个是使用ScriptableObject类。我最终想要的是使用所描述的适配器框架来传递JavaScript对象。这样做,这就是Adapter JS-impl代码的样子:
function add2(a) {
return {
result: com.ibm.us.roberso.Calculator.add2(a)
};
调用上述适配器的客户端应用程序中的JavaScript代码。请注意,我有一个函数来测试将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对象传递,你会传递任何参数插入适配器。当worklight尝试执行java方法时,它将查找采用Object或ScriptableObject(而非NativeObject)的方法签名。我使用java反射api来验证传入的类和层次结构。在ScriptableObject上使用静态方法,您可以查询和修改对象中的值。在该方法结束时,您可以让它返回一个脚本对象。这样做会在invocationResults.result字段中返回一个javascript对象。下面是支持这个的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端进行操作。
只要将它作为字符串传递并使用任何可用于Java的JSON库中的任何一种,都可以:https://github.com/douglascrockford/JSON-java/blob/master/JSONObject.java – Zarathuztra