RequestDispatcher заканчивается бесконечным циклом - PullRequest
0 голосов
/ 02 ноября 2011

У меня есть два приложения WAR, и связь между ними осуществляется через сервлеты.

Мое приложение (WAR A) открывает дочернее окно с URL-адресом сервлета в другой WAR (скажем, WAR B).

Сервлет (в WAR B) обрабатывает данные и должен отправить обработанные данные обратно в сервлет исходного приложения (т. Е. Сервлет WAR A).

Но этот процесс заканчивается бесконечным циклом, а также параметры URL, отправленные из WAR-A, равны нулю.

Вот фрагмент кода:

Приведенный ниже скрипт открывает дочернее окно с URL сервлета в WAR-B, также передавая некоторые параметры URL.

function invokePlugin(invokeURL, custValJSON, meaCompPartJSON) {
    window.open(invokeURL + '?custValJSON=' + custValJSON,'');
}

Ниже приведен код сервлета в WAR-B, который извлекает параметры URL, обрабатывает данные и снова отправляет запрос обратно сервлету WAR-A ...

private void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String custValJSON = request.getParameter("custValJSON");
    System.out.println("custValJSON : " + custValJSON);

    CustomValues custVal = gson.fromJson(custValJSON, CustomValues.class);

    if(custVal != null) {
        System.out.println("Cust val details : " + custVal.getName());
        custVal.setValue("Satya");
    }

    String destination = "/testPlannerPluginResult";

    RequestDispatcher reqDispatch = request.getRequestDispatcher(destination);
    request.setAttribute("custValJSON", gson.toJson(custVal));

    if(reqDispatch != null) {
        reqDispatch.forward(request, response);
    }
}

У кого-нибудь есть идеи по этому поводу?

С уважением,

Satya

1 Ответ

2 голосов
/ 02 ноября 2011

Это просто означает, что сервлет в основном вызывает себя каждый раз.Я не сразу вижу причину в приведенной информации, но, очевидно, URL, который вы передали в getRequestDispatcher(), совпадает с URL самого сервлета.

Однако я вижу здесь серьезную ошибку:

RequestDispatcher reqDispatch = request.getRequestDispatcher(destination);
request.setAttribute("custValJSON", gson.toJson(custVal));

Невозможно вызвать сервлет, работающий в другом контексте сервлета (читай: еще одна WAR).Вам необходимо ServletContext#getContext() сначала получить другой контекст сервлета, а затем использовать ServletContext#getRequestDispatcher() для отправки туда запроса.

ServletContext otherServletContext = getServletContext().getContext("/otherContextPath");
RequestDispatcher dispatcher = otherServletContext.getRequestDispatcher(destination);

Для этого требуется только, чтобы обе WAR-файлы были настроены для предоставления контекста для совместного использования.Например, на Tomcat это можно сделать, добавив crossContext="true" к <Context>.

...