戻り値

サンプルアプリケーションを作って試してみました。

<!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側の引数のクラスときっちり同じじゃないとまずいみたいです。