[英]How to dispatch servlet requests to Jersey resource methods
我想知道是否可以将请求从 servlet 分派到 Jersey(JAX-RS 实现)资源类。 我正在尝试这样做,但它似乎不起作用,并且根据我的日志记录,从未到达球衣资源。
代码示例如下。 由于某种原因,我试图做的事情是不可能的吗?
请注意,当我通过地址栏在 Web 浏览器中直接访问Jersey 资源时,它可以正常工作。
另请注意,“RequestDispatcher.forward()”按预期工作。 只是“包括”没有。
小服务程序
//The Jersey dispatcher url-filter is set to '/api/*'
String servletID = "/api/items";
RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(servletID);
dispatcher.include(request, response);
泽西岛资源
@GET @Path("/items")
@Produces ({MediaType.TEXT_XML})
public JAXBElement<Items> getItems(@PathParam("project") String project) throws IOException, JAXBException {
log.debug("reached getItems");
//Omitted code that returns 'Items' object wrapped in JAXBElement
}
web.xml 的相关部分
<servlet>
<servlet-name>jerseyDispatcher</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>uk.co.web.api.resource</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>jerseyDispatcher</servlet-name>
<url-pattern>/api/*</url-pattern>
</servlet-mapping>
您可以转发请求。
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
RequestDispatcher requestDispatcher = null;
requestDispatcher = httpServletRequest.getRequestDispatcher("/items");
dispatcher.forward(request, response);
return;
但是请注意,如果您收到 GET 请求并尝试转发到 POST 资源,它将抛出 405 错误。
编辑:
让我了解您想要实现的目标,如果您需要将内容写入响应输出流,您可以使用 jersey 资源过滤器。
public class YourResourceFilter implements ResourceFilter
{
public ContainerRequestFilter getRequestFilter()
{
return new ContainerRequestFilter()
{
@Override
public ContainerRequest filter(ContainerRequest containerRequest)
{
//Pre- editing the request
return containerRequest;
}
};
}
@Override
public ContainerResponseFilter getResponseFilter()
{
return new ContainerResponseFilter()
{
@Override
public ContainerResponse filter(ContainerRequest containerRequest, ContainerResponse containerResponse)
{
// after the request has been completed by your jersey resource
return containerResponse;
}
};
}
}
我通过在 web.xml 中将 Jersey 配置为过滤器而不是 servlet 来使其工作,有点(Jersey 2.13)。 然后,您可以告诉容器也将过滤器应用于包含的请求:
<filter-mapping>
<filter-name>Jersey Web Application</filter-name>
<url-pattern>/api/*</url-pattern>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
RequestDispatcher.include 然后也适用于 Jersey 处理的请求。 不过,有一个警告。 Jersey 调用 response.getOutputStream,因此所有输出都必须通过所述输出流执行 - 这排除了使用 response.getWriter 的 JSP 页面。 因此,除非您弄清楚如何解决该问题,否则不要在 JSP 页面中包含 Jersey 资源,反之亦然,将 JSP 的评估结果作为 REST 响应的一部分包含在内。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.