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