为了更好地解释我在这里做什么,我希望能够将 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 上的静态方法,您可以查询和修改对象中的值。在方法结束时,您可以让它返回一个 Scriptable 对象。这样做会在 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 端进行操作。