簡體   English   中英

如何將 servlet 請求分派到 Jersey 資源方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM