我想在worklight中将完整的JSON对象传递给java适配器。此适配器将调用多个其他远程资源来完成请求。我想传递json结构,而不是列出所有参数,原因有很多。调用worklight过程效果很好。我将以下内容作为参数传递:
{ "parm1": 1, "parm2" : "hello" }
哪个工具很好用。当它调用我的java代码时,我看到传递的JSObjectConverter $ 1的对象类型。在java调试中,我可以看到对象中的值,但是我没有看到有关如何执行此操作的任何文档。如果内存为我服务,$ 1表示它是一个正在传递的匿名内部类。有没有更好的方法在适配器中传递json对象/结构?
答案 0 :(得分:0)
让我们假设你在适配器代码中有这个
function test(){
var jsonObject = { "param1": 1, "param2" : "hello" };
var param2value = com.mycode.MyClass.parseJsonObject(jsonObject);
return {
result: param2value
};
}
从哪里获取jsonObject并不重要,它可能来自客户端的参数。 Worklight使用Rhino JS引擎,因此com.mycode.MyClass.parseJsonObject()函数将jsonObject作为org.mozilla.javascript.NativeObject获取。您可以轻松获得像这样的obj属性
package com.mycode;
import org.mozilla.javascript.NativeObject;
public class MyClass {
public static String parseJsonObject(NativeObject obj){
String param2 = (String) NativeObject.getProperty(obj, "param2");
return param2;
}
}
答案 1 :(得分:0)
为了更好地解释我在这里做的事情,我希望能够将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 reflection 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对象有两种方法。