如何将servlet请求分派给Jersey资源方法

时间:2014-01-15 23:29:48

标签: java rest servlets jersey requestdispatcher

我想知道是否可以从servlet向Jersey(JAX-RS实现)资源类发送请求。我试图这样做,但它似乎没有用,根据我的记录,从未达到球衣资源。

代码示例如下。我出于某种原因想做什么不可能?

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

另请注意'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);    

泽西岛资源

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

2 个答案:

答案 0 :(得分:0)

您可以转发请求。

HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
RequestDispatcher requestDispatcher = null;
requestDispatcher = httpServletRequest.getRequestDispatcher("/items");
dispatcher.forward(request, response);
return;

但请注意,如果您收到GET请求并尝试转发到POST资源, 它会抛出405错误。

编辑:

让我了解您要实现的目标,如果您需要将内容写入响应输出流,则可以使用泽西资源过滤器。

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

    }

答案 1 :(得分:0)

我通过在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调用response.getOutputStream,因此必须通过所述输出流执行所有输出 - 这将排除使用response.getWriter的JSP页面。因此,除非您弄清楚如何解决问题,否则不要在JSP页面中包含Jersey资源,反之亦然,包括将JSP作为REST响应的一部分进行评估的结果。