Ajax-вызов GenericPortlet.serveResource () в WebSphere Portal 6.1 - PullRequest
5 голосов
/ 11 февраля 2011

Я пытаюсь вызвать метод serveResource () портлета, используя jQuery / ajax. Мне удалось получить простой портлет JSR-286, работающий в Pluto 2.0, который может читать строку JSON из тела запроса, создавать объект Java из JSON и возвращать toString () этого объекта в мой вызывающий JavaScript. Однако, когда я развертываю * тот же портлет в WebSphere Portal 6.1, тело запроса к моменту достижения serveResource () остается пустым.

Я предполагаю, что упускаю что-то базовое / фундаментальное, поэтому любой совет будет оценен. Я думаю, что мог бы заставить мой пример работать, если бы я вставил строку JSON в параметры URL, но предпочел бы пока избегать этого подхода, если только мне не объяснят причину, по которой мой текущий подход «плохой».

Редактировать: * Если быть более точным, я развернул тот же портлет на WAS7 с WSRP Producer и использованием портлета через WebSphere Portal 6.1.

Фрагмент 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);
    }
}

Ответы [ 2 ]

1 голос
/ 16 февраля 2011

Наконец-то все заработало ... вроде.

Путем изменения параметра contentType в моем вызове ajax на 'application / x-www-form-urlencoded' (и использование различных методов представления моих данных) Теперь мои данные доступны в теле сообщения в моей среде WebSphere, хотя и в форме параметра URL, а не в JSON.

К сожалению, внесение этого изменения привело к нарушению функциональности в Плутоне.Тело запроса в этой среде теперь пусто.

Теперь нужно либо изменить код для извлечения данных из request.getParameter () (который, как я считаю, работает в обеих средах с моим изменением, но требует дальнейшего тестирования), либо найтиcontentType, который приведет к заполнению тела запроса в обеих средах.

0 голосов
/ 16 октября 2014

При публикации запроса JSON dataType должен быть JSON.

dataType: 'JSON',

...