是否可以将请求从 WebServlet 转发到 rest helper servlet (javax.ws.rs.core.Application)

Is it possible to forward a Request from a WebServlet to rest helper servlet (javax.ws.rs.core.Application)

问题: 我有一个 WebFilter,它将有效的 URL 转发到代理 servlet 或处理网页的 servlet,供管理员监控最近的请求等等。

admin servlet 支持将 ajax 请求转发到 REST 服务(在 login.jsp 从 controlpannel.jsp 呈现的网页中)但显然其余服务具有不同的上下文WebFilter 和 WebServlets ?

问题: 那么是否有可能从我的 WebServlet 转发到其余的帮助程序 servlet(及其资源 classes)?

更具体的信息:

我是这样使用转发的:

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

我试图转发到这个 uri:

forwardURI = /REST/proxy_client/newer_than

我的休息助手 servlet:

@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;
}

}

而这个资源class:

@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);
}

解决方案尝试:

我发现这个 question 关于如何从 servlet 调用 rest web 服务,但他们使用客户端并且没有转发。

编辑:

我有一个配置问题(可能还有一个),所以现在当我尝试转发到我的 rest helper servlet(扩展 javax.ws.rs.core.Application 的那个)时,我得到这个错误:

RestServlet is currently unavailable 

(在web.xml我调用了Servlet RestServlet)

当直接访问 REST api 时,我得到:

HTTP Status 500 - Authenticator.invoke() failed

但我不知道这是什么意思。

编辑2:

我将尝试使用 web.xml subclassing 中的配置重新调整 Applicaton 的 subclass,@ApplicationPath 似乎对我不起作用。此外,当我尝试获取其余的 ServletsContext 时,我收到一个错误,指出未指定 class,这是您在使用 web.xml 配置时所做的事情。

编辑3:

我正在 HCP 上部署我的应用程序,并且潜在的问题是我什至无法访问我的 REST 服务我 found 这个 SAP 讨论。 当我的 REST 服务在没有转发的情况下工作时,我会在这里报告。

编辑4: 这实际上回答了 Edit3 的问题 我必须将 jersey 1.19.1(不是 2.x 因为我使用的是 Java EE6,它只支持 DWP 3.0 而不是 3.1 根据需要添加到项目库中,否则它会说我没有指定一个 servlet class(但是当我尝试添加 javax.ws.rs.core.Application 它会告诉我这不是 Servlet class,即使我已经看到了这个配置)。

我真正的问题是来自 SAP Hana Cloud Platform 上 Java ee6 容器的 javax.ws.rs.core.Application 不工作,原因不明。

解决方案是下载 jersey-bundle-1.19.1.jar 并将其添加到 WEB-INF/lib 和项目库。

将请求从 vanilla servlet 转发到 rest 服务完全没有问题! 如果它不起作用你的情况很可能是你的设置或一些意想不到的原因,就像我的情况一样。