5

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

2 に答える 2

1

最後にそれが機能するようになりました...一種の。

「application/x-www-form-urlencoded」への ajax 呼び出しの contentType パラメーターを変更する (そして、データを表現するさまざまな方法を試す) ことで、WebSphere 環境の投稿本文でデータを利用できるようになりました。 JSON ではなく URL パラメーター形式。

残念ながら、この変更を行うと、Pluto の機能が壊れてしまいます。その環境のリクエスト本文は空になりました。

ここで、request.getParameter() からデータを取得するようにコードを変更するか (私の変更により両方の環境で動作すると思われますが、さらにテストが必要です)、または両方の環境で要求本文が入力される contentType を見つけます。

于 2011-02-15T21:26:17.997 に答える
0

JSON リクエストを投稿しているため、dataType は JSON である必要があります。

データ型: 'JSON',

于 2014-10-16T12:18:14.567 に答える