Можно ли перенаправить запрос из WebServlet на вспомогательный сервлет отдыха (javax.ws.rs.core.Application)

Проблема: у меня есть WebFilter, который перенаправляет действительные URL-адреса либо сервлету-посреднику, либо сервлету, который обрабатывает веб-страницу для администратора, чтобы отслеживать недавние запросы и многое другое.

Сервлет администратора должен пересылать запросы ajax в службу REST (после login.jsp с веб-страницы, представленной controlpannel.jsp), но, по-видимому, остальные службы имеют другой контекст, как WebFilter и WebServlets?

Вопрос: Так возможно ли вообще перенаправить мой WebServlet сервлету-помощнику rest (и его классам ресурсов)?

Более конкретная информация:

Вот как я использую пересылку:

ServletContext sc = request.getServletContext();
RequestDispatcher dispatcher = sc.getRequestDispatcher(forwardURI);
dispatcher.forward(request, response);

Я попытался переслать на этот URI:

forwardURI = /REST/proxy_client/newer_than

Мой помощник сервлет покоя:

@Stateless
@ApplicationPath("/REST")
public class RestService extends Application {
@Override
public Set<Class<?>> getClasses() {
    final Set<Class<?>> restResourceClasses = new HashSet<Class<?>>();
    restResourceClasses.add(ProxyClientResource.class);
    return restResourceClasses;
}

}

И этот класс ресурсов:

@Path("/proxy_client")
@Stateless
public class ProxyClientResource {
@EJB
private ProxyClientBean proxyClientBean;

@GET
@Produces("application/json")
@Path("/newer_than")
public String getNumberOfEntriesNewerThanTimestamp(@QueryParam("timestamp") Expression<Timestamp> indexTimestamp,
        @QueryParam("numberOfclients") Integer numberOfclients) {
    List<ProxyClient> pageData = proxyClientBean.getElementsNewerThan(numberOfclients, indexTimestamp);
    return convertToJSONstring(pageData);
}

Попытка решения:

Я нашел этот вопрос о том, как вызвать остальной веб-сервис из сервлета, но они используют клиента и не переадресовывают.

РЕДАКТИРОВАТЬ:

У меня была проблема с настройкой (возможно, она еще есть), поэтому теперь, когда я пытаюсь переслать мой вспомогательный сервлет rest (расширяющий javax.ws.rs.core.Application), я получаю эту ошибку:

RestServlet is currently unavailable 

(в web.xml я называю сервлет RestServlet)

При непосредственном доступе к REST API я получаю:

HTTP Status 500 - Authenticator.invoke() failed

но я не могу понять, что это значит.

Edit2:

Я попробую изменить подкласс Applicaton с помощью конфигурации в подклассе web.xml, и @ApplicationPath, похоже, не работает для меня. Также, когда я пытаюсь получить остальные ServletsContext, я получаю сообщение об ошибке, что класс не указан, что вы делаете при использовании конфигурации web.xml.

Edit3:

Я развертываю свое приложение на HCP, и из-за основной проблемы, связанной с невозможностью доступа к службе REST, я нашел это обсуждение SAP. Когда я получу сервис REST без пересылки, я сообщу здесь.

Edit4: это фактически отвечает на вопрос из Edit3. Мне пришлось добавить трикотаж 1.19.1 (не 2.x, потому что я использую Java EE6, который поддерживает только до DWP 3.0, а не 3.1, как требуется) для библиотек проектов, в противном случае было бы сказано, что я не не указать класс сервлета (но когда я попытался добавить javax.ws.rs.core.Application, он сказал бы, что это не класс Servlet, хотя я видел эту конфигурацию).

1 ответ

Решение

Моя настоящая проблема заключалась в том, что javax.ws.rs.core.Application из контейнера Java ee6 в SAP Hana Cloud Platform не работал по неизвестной причине.

Решение было скачать и добавить jersey-bundle-1.19.1.jar в WEB-INF/lib и библиотеки проектов.

Нет проблем направить запрос от ванильного сервлета в службу отдыха! Если это не работает в вашем случае, скорее всего, это ваша установка или какая-то неожиданная причина, как это было в моем случае.

Другие вопросы по тегам