5

我正在尝试使用 jQuery/ajax 调用 portlet 的 serveResource() 方法。我设法在 Pluto 2.0 中获得了一个简单的 JSR-286 portlet,它能够从请求正文中读取 JSON 字符串,从 JSON 创建一个 Java 对象,并将该对象的 toString() 返回给我的调用 JavaScript。但是,当我将*相同的 portlet 部署到 WebSphere Portal 6.1 时,请求正文在到达 serveResource() 时为空。

我假设我缺少一些基本/基本的东西,所以任何建议都将不胜感激。如果我将 JSON 字符串推送到 URL 参数上,我想我可以让我的示例工作,但现在更愿意避免这种方法,除非我给出了我当前方法“不好”的原因。

编辑:*更具体地说,我将相同的 portlet 部署到运行 WSRP Producer 并通过 WebSphere Portal 6.1 使用该 portlet 的 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

终于让它工作了……有点。

通过将我的 ajax 调用中的 contentType 参数更改为“application/x-www-form-urlencoded”(并使用不同的方法来表示我的数据),我现在可以在我的 WebSphere 环境中的帖子正文中使用我的数据,尽管在URL 参数形式而不是 JSON。

不幸的是,执行此更改导致破坏 Pluto 中的功能。该环境中的请求正文现在为空。

现在要么更改代码以从 request.getParameter() 检索数据(我相信我的更改在这两种环境中都有效,但需要进一步测试)或找到一个 contentType 将导致在两个环境中填充请求正文。

于 2011-02-15T21:26:17.997 回答
0

当您发布 JSON 请求时,数据类型必须是 JSON。

数据类型:'JSON',

于 2014-10-16T12:18:14.567 回答