2014-01-17 1 views
2

워크 라이트의 자바 어댑터에 완벽한 JSON 객체를 전달하고 싶습니다. 이 어댑터는 여러 가지 다른 원격 리소스를 호출하여 요청을 수행합니다. 나는 여러 가지 이유로 모든 매개 변수를 나열하는 대신 json 구조를 전달하고자합니다. 작업 절차를 호출하면 잘 작동합니다. 다음 매개 변수를 매개 변수로 전달합니다.Worklight 자바 어댑터에 JSON 객체 전달하기

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

도구로 문제가 없습니다. 내 Java 코드를 호출하면 전달되는 JSObjectConverter $ 1의 객체 유형이 표시됩니다. 자바 디버그에서 개체의 값을 볼 수 있지만이 작업을 수행하는 방법에 대한 설명서가 표시되지 않습니다. 메모리가 나를 지원한다면, $ 1은 그것이 전달되는 익명의 내부 클래스라고 말합니다. JSON 객체/구조체를 어댑터에 전달하는 더 좋은 방법이 있습니까?

+0

그냥 문자열로 전달하고 자바에서 사용할 수있는 무수히 많은 JSON 라이브러리를 사용하면됩니다. https://github.com/douglascrockford/JSON-java/blob/master/JSONObject.java – Zarathuztra

답변

0

같은 OBJ 특성을 얻을 수있다, 나는 어댑터에 자바 스크립트 객체를 통과 할 수 있기를 원하고 그것이 자바 스크립트 객체를 업데이트 반환해야합니다. 두 가지 방법이있는 것처럼 보입니다. 첫 번째는 며칠 전에 직렬화 및 자바 스크립트 개체의 unserializing 함께 무엇을 대답했다. 다른 하나는 ScriptableObject 클래스를 사용하고 있습니다. 내가 원하는 것은 javascript 객체를 전달하기 위해 설명 된대로 어댑터 프레임 워크를 사용하는 것이 었습니다. 이렇게하면 Adapter JS-impl 코드가 다음과 같이 표시됩니다.

function add2(a) { 
return { 
    result: com.ibm.us.roberso.Calculator.add2(a) 
}; 

위 어댑터를 호출하는 클라이언트 응용 프로그램의 JavaScript 코드입니다. 어댑터 프레임 워크에 매개 변수로 javascript 객체를 전달하는 테스트하는 함수가 있습니다. 아래 invocationData.parameters 참조 : runAdapterCode2 (에서

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); 
} 

)을, 당신은 어댑터에 모든 매개 변수를 전달하는 것처럼 자바 스크립트 객체가 전달됩니다. 작업 표시 줄이 Java 메소드를 실행하려고하면 Object 또는 ScriptableObject (NativeObject 아님)를 가져 오는 메소드 서명을 찾습니다. 자바 리플렉션 API를 사용하여 전달되는 클래스와 계층 구조를 확인했습니다. ScriptableObject에서 정적 메서드를 사용하면 개체의 값을 쿼리하고 수정할 수 있습니다. 메서드가 끝나면 Scriptable 객체를 반환 할 수 있습니다. 이렇게하면 invocationResults.result 필드에 자바 스크립트 객체가 다시 생깁니다. 아래는 이것을 지원하는 자바 코드입니다. 어떤 객체 유형이 실제로 전달되는지에 대한 조사의 일부로 코드의 상당 부분이 존재한다는 점에 유의하십시오. 메소드의 맨 아래에는 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; 
} 

자바 스크립트 개체의 경우 숫자 값은 Long이며 int가 아닙니다. 문자열은 여전히 ​​문자열입니다.

요약 지금까지 찾은 자바 스크립트 개체를 전달하는 데는 두 가지 방법이 있습니다.

  1. 문자열을 자바 스크립트로 변환하고 문자열을 java로 전달한 다음 JSONObject로 다시 구성합니다.
  2. 자바 스크립트 객체를 전달하고 ScriptableObject 클래스를 사용하여 자바 측에서 조작합니다.
0

당신이에서 된 JSONObject를 얻고있는 곳 정말 문제, 그것은 클라이언트에서 PARAM으로 올 수 없음 어댑터 코드

function test(){ 
    var jsonObject = { "param1": 1, "param2" : "hello" }; 

    var param2value = com.mycode.MyClass.parseJsonObject(jsonObject); 

    return { 
     result: param2value 
    }; 
} 

이 있다고 가정 할 수 있습니다. Worklight는 Rhino JS 엔진을 사용하므로 com.mycode.MyClass.parseJsonObject() 함수는 jsonObject를 org.mozilla.javascript.NativeObject로 가져옵니다. 당신은 쉽게 더 나은 내가 여기서 뭘하는지 설명하기 위해이

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; 
    } 
} 
+0

JSONObject를 매개 변수로 전달하여 하드 코딩하는 경우 JSONObject를 JSONArray로 캐스팅 할 수 없다는 오류가 발생합니다. invocationData를 만들 때 jsonObject를 매개 변수로 사용합니다. jsonObject 주위에 '['와 ']'를 추가하면 자유에서 parsonJsonObject (object) java 오류 메시지를 찾을 수 없습니다. –

+0

이것은 array가 JSON 객체가 아니기 때문입니다. JSON 객체는 {}로 싸여 있으며, 배열은 []로 싸여 있습니다. 당신은 당신의 param 견본을 줄 수 있습니까? 너 정확히 뭘 하려구? – Anton

+0

Anton, 위의 다른 응답을 참조하십시오. 나는 다시 가서 ScriptableObject를 어댑터 코드로 넘기는지를 결정할 수 있었다. 내가 사용하고있는 코드를 넣었습니다. 내가 뭔가를 놓친다면 알려주세요. –

관련 문제