简体   繁体   English

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

[英]How to dispatch servlet requests to Jersey resource methods

I am wondering if it is possible to dispatch a request from a servlet to a Jersey (JAX-RS implementation) resource class.我想知道是否可以将请求从 servlet 分派到 Jersey(JAX-RS 实现)资源类。 I am trying to do it but it doesn't seem to work and according to my logging, the jersey resource is never reached.我正在尝试这样做,但它似乎不起作用,并且根据我的日志记录,从未到达球衣资源。

Code examples are below.代码示例如下。 Is what I'm trying to do impossible for some reason?由于某种原因,我试图做的事情是不可能的吗?

Please note, the Jersey resource works correctly when I access it directly in a web browser via the address bar.请注意,当我通过地址栏在 Web 浏览器中直接访问Jersey 资源时,它可以正常工作

Also please note that 'RequestDispatcher.forward()' works as expected.另请注意,“RequestDispatcher.forward()”按预期工作。 It is just 'include' that doesn't.只是“包括”没有。

The servlet小服务程序

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

The Jersey resource泽西岛资源

@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

}

Relevant parts of web.xml 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>

It is possible you forward the request.您可以转发请求。

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

However note if you receive a GET request and try to forward to a POST resource, It will throw a 405 error.但是请注意,如果您收到 GET 请求并尝试转发到 POST 资源,它将抛出 405 错误。

Edit:编辑:

Let me understand what you are trying to achieve, if you need write content to response output stream you could use jersey Resource Filter.让我了解您想要实现的目标,如果您需要将内容写入响应输出流,您可以使用 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;
                }
            };
        }

    }

I got it to work, sort of (Jersey 2.13) by configuring Jersey as a filter, and not a servlet, in web.xml.我通过在 web.xml 中将 Jersey 配置为过滤器而不是 servlet 来使其工作,有点(Jersey 2.13)。 Then, you can tell the container to apply the filter to included requests too:然后,您可以告诉容器也将过滤器应用于包含的请求:

<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 will then work for request handled by Jersey, too. RequestDispatcher.include 然后也适用于 Jersey 处理的请求。 There's a caveat, though.不过,有一个警告。 Jersey calls response.getOutputStream, so all output must be performed through said output stream - this rules out JSP pages, that use response.getWriter instead. Jersey 调用 response.getOutputStream,因此所有输出都必须通过所述输出流执行 - 这排除了使用 response.getWriter 的 JSP 页面。 So, unless you figure out how to work around the problem, forget about including a Jersey resource in a JSP page or, vice versa, including the result of evaluating a JSP as part of a REST response.因此,除非您弄清楚如何解决该问题,否则不要在 JSP 页面中包含 Jersey 资源,反之亦然,将 JSP 的评估结果作为 REST 响应的一部分包含在内。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM