java - 如何将 servlet 请求分派(dispatch)到 Jersey 资源方法

标签 java rest servlets jersey requestdispatcher

我想知道是否可以将请求从 servlet 分派(dispatch)到 Jersey(JAX-RS 实现)资源类。我正在尝试这样做,但它似乎不起作用,并且根据我的日志记录, Jersey 资源从未达到。

代码示例如下。我想做的事情是否由于某种原因而不可能实现?

请注意,当我通过地址栏直接在网络浏览器中访问 Jersey 资源时,它可以正常工作。

另请注意,“RequestDispatcher.forward()”按预期工作。只是“包含”没有。

servlet

//The Jersey dispatcher url-filter is set to '/api/*'
String servletID = "/api/items";
RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(servletID);
dispatcher.include(request, response);    

Jersey 资源

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

    }

关于java - 如何将 servlet 请求分派(dispatch)到 Jersey 资源方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21150488/

相关文章:

jsp - 使 Servlet 重新加载调用它的页面

java - 返回扩展类

.net - REST API : GET request with body

java - 如何在 spring 框架中编码 url?

java - 不同的 JSON 数组响应

vba - 尝试在 VBA 中发出 HTTP 请求时出现 "method not valid without suitable object"错误?

jsp - 在不使用 session 上下文的情况下在 Web 应用程序中保留值

java - 如何删除直方图中的重复字符[JAVA]

java - IEEE 754 double 从 MIPS C 到 Java 的转换

java - LMAX干扰者: How to control the speed of producers?