是否可以从WebServlet转发请求以休息辅助servlet(javax.ws.rs.core.Application)

时间:2017-09-05 11:05:29

标签: java rest servlets jax-rs hana-cloud-platform

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

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

问题: 那么是否可以从我的WebServlet转发到其他帮助程序servlet(及其资源类)?

更具体的信息:

这就是我使用转发的方式:

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

}

这个资源类:

@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

但我无法找出这意味着什么。

EDIT2:

我将尝试使用web.xml子类中的配置重新调整Applicaton的子类,并且@ApplicationPath似乎对我不起作用。此外,当我尝试获取其余的ServletsContext时,我得到一个错误,没有指定任何类,这是你在使用web.xml配置时所做的事情。

EDIT3:

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

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

1 个答案:

答案 0 :(得分:1)

我真正的问题是SAP Hana Cloud Platform上的Java ee6容器中的javax.ws.rs.core.Application因未知原因而无效。

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

将来自vanilla servlet的请求转发给其他服务完全没有问题! 如果它在您的情况下不起作用,则很可能是您的设置或一些意想不到的原因,就像我的情况一样。