将JSON对象传递给worklight java适配器

时间:2014-01-17 17:49:49

标签: ibm-mobilefirst worklight-adapters

我想在worklight中将完整的JSON对象传递给java适配器。此适配器将调用多个其他远程资源来完成请求。我想传递json结构,而不是列出所有参数,原因有很多。调用worklight过程效果很好。我将以下内容作为参数传递:

{ "parm1": 1, "parm2" : "hello" }

哪个工具很好用。当它调用我的java代码时,我看到传递的JSObjectConverter $ 1的对象类型。在java调试中,我可以看到对象中的值,但是我没有看到有关如何执行此操作的任何文档。如果内存为我服务,$ 1表示它是一个正在传递的匿名内部类。有没有更好的方法在适配器中传递json对象/结构?

2 个答案:

答案 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对象有两种方法。

  1. 转换为javascript中的字符串,将字符串传递给java,并将其重新构建为JSONObject。
  2. 传递javascript对象并使用ScriptableObject类在java端进行操作。