是否可以将请求从 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 服务完全没有问题! 如果它不起作用你的情况很可能是你的设置或一些意想不到的原因,就像我的情况一样。
问题: 我有一个 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 服务完全没有问题! 如果它不起作用你的情况很可能是你的设置或一些意想不到的原因,就像我的情况一样。