戻り値
サンプルアプリケーションを作って試してみました。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <jsp:useBean id="JSONRPCBridge" scope="session" class="com.metaparadigm.jsonrpc.JSONRPCBridge" /> <jsp:useBean id="sampleService" scope="session" class="org.asyrinx.brownie.jsonrpc.sample1.SampleService" /> <% JSONRPCBridge.registerObject("sampleService", sampleService); %> <html> <head> <script type="text/javascript" src="jsonrpc.js"></script> <script type="text/javascript" language="JavaScript"><!-- function onLoad() { jsonrpc = new JSONRpcClient("/json-sample/JSON-RPC"); } function invokeThru() { var paramObj = { "javaClass": "org.asyrinx.brownie.jsonrpc.sample1.SampleParam1", "param1": "", "param2": 0 } var methodListTag = document.getElementById("methodList"); var selectedIndex = methodListTag.selectedIndex; var selectedTag = methodListTag.options[selectedIndex]; var param1Tag = document.getElementById("param1"); var param2Tag = document.getElementById("param2"); var resultTag = document.getElementById("result"); // paramObj.param1 = param1Tag.value; paramObj.param2 = param2Tag.value * 1; var scriptlet = "jsonrpc.sampleService." + selectedTag.text + "( paramObj )"; try { var result = eval( scriptlet ); resultTag.value = toJSON( result ); } catch( e ) { resultTag.value = e; } } --></script> <title>JSON-RPC-Java Sample1</title> </head> <body bgcolor="#ffffff" onLoad="onLoad()"> <h2>JSON-RPC-Java Sample1</h2> <select id="methodList"> <option>thruByObj</option> <option>thruBySampleParam1</option> <option>repeat</option> </select> <p>The JSON-RPC-Java <em>Invocation</em> application.</p> <p> param1: <input type="text" id="param1" value=""/><br/> param2: <input type="text" id="param2" value=""/><br/> <input type="button" value="invoke method" onclick="invokeThru()" /> </p> <textarea id="result" cols="120" rows="20"></textarea> </body> </html>
sample1.jsp
package org.asyrinx.brownie.jsonrpc.sample1; import java.util.ArrayList; import java.util.List; /** * @author takeshi */ public class SampleService { public Object thruByObj(Object param) { return param; } public SampleParam1 thruBySampleParam1(SampleParam1 param1) { return param1; } public List repeat(SampleParam1 param1) { final List result = new ArrayList(); for (int i = 0; i < param1.getParam2(); i++) { result.add(param1); } return result; } }
SampleService.java
package org.asyrinx.brownie.jsonrpc.sample1; /** * @author takeshi */ public class SampleParam1 { private String param1 = null; private int param2 = 0; public String getParam1() { return param1; } public void setParam1(String param1) { this.param1 = param1; } public int getParam2() { return param2; } public void setParam2(int param2) { this.param2 = param2; } }
SampleParam1.java
戻り値もちゃんとオブジェクトとしてゲットできるみたいです。
上のサンプルでthruBySampleParam1を選んで、param1にABC、param2に123 と指定していた場合以下のように表示します。
{"param2": 123, "javaClass": "org.asyrinx.brownie.jsonrpc.sample1.SampleParam1", "param1": "ABC"}
でも残念なことに、SampleServiceのthruByObjを呼び出すと
JSONRpcClientException: arg 1 java.lang.Object is not a bean
という例外がjavaScript側で発生します。JavaScript側で引数として渡すオブジェクトは、Java側の引数のクラスときっちり同じじゃないとまずいみたいです。