jQuery/ajax を使用して、ポートレットの serveResource() メソッドを呼び出そうとしています。Pluto 2.0 で動作する単純な JSR-286 ポートレットを取得することができました。このポートレットは、要求本文から JSON 文字列を読み取り、JSON から Java オブジェクトを作成し、そのオブジェクトの toString() を呼び出し元の JavaScript に返すことができます。ただし、同じポートレットを WebSphere Portal 6.1 にデプロイ*すると、リクエストの本文は、serveResource() に到達するまでに空になります。
基本的/基本的な何かが欠けていると思いますので、アドバイスをいただければ幸いです。JSON 文字列を URL パラメーターにプッシュすれば、サンプルを機能させることができると思いますが、現在のアプローチが「悪い」という理由がない限り、今のところそのアプローチは避けたいと思います。
編集: *より具体的に言うと、WSRP Producer を実行し、WebSphere Portal 6.1 経由でポートレットを使用する WAS7 に同じポートレットをデプロイしました。
Javascript スニペット:
function ajaxPost() {
var url = "<%= testServiceURL %>";
var current = $("input.current").val();
$.ajax(
{
url: url,
contentType: 'application/json; charset=utf-8',
dataType: 'html',
data: "{data: " + current + "}",
type: 'POST',
success: testSuccess,
error: testError
}
);
$("div.trace").append("ajax post fired<br />");
}
function testSuccess(data, textStatus, XMLHttpRequest)
{
$("div.trace").append("testSuccess(): " + data + "<br />");
}
ポートレット スニペット:
public class TestPortlet extends GenericPortlet {
...
@Override
public void serveResource(ResourceRequest request, ResourceResponse response) throws PortletException, IOException {
String res = "Failed to read body";
boolean bodyRead = true;
StringBuffer sb = new StringBuffer();
String line = null;
try {
BufferedReader reader = request.getReader();
line = reader.readLine();
while (line != null) {
sb.append(line);
line = reader.readLine();
}
reader.close();
} catch (Exception e) {
bodyRead = false;
}
Foo f = null;
if (bodyRead) {
try {
Gson gson = new Gson();
f = gson.fromJson(sb.toString(), Foo.class);
res = "Received: " + f.toString();
} catch (Exception e) {
res = "Failed to convert body into Foo: '" + sb.toString() + "'";
}
}
response.setContentType("text/html");
response.getWriter().println(res);
}
}