1

サーブレットからジャージー (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>
4

2 に答える 2

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

    }
于 2014-01-16T07:55:39.923 に答える