0

我可以在 jersey1.17 中运行使用 ContainerResponseFilter 扩展的 CustomFilter。我正在使用 GrizzlyWebServer。请建议。下面给出的是我添加过滤器的示例服务器代码。

   GrizzlyWebServer webServer = new GrizzlyWebServer(.............);
    ....
    ....

    ServletAdapter adapter3 = new ServletAdapter();
    adapter3.addInitParameter("com.sun.jersey.config.property.packages", "com.motilink.server.services");
    adapter3.setContextPath("/");
    adapter3.setServletInstance(new ServletContainer());
    adapter3.addContextParameter(ResourceConfig.PROPERTY_CONTAINER_RESPONSE_FILTERS, PoweredbyResponseFilter.class.getName());
    webServer.addGrizzlyAdapter(adapter3, new String[]{"/"});

   ...
   .....
4

2 回答 2

0

我的过滤器:

 @FrontierResponse
 @Provider
 public class PoweredbyResponseFilter implements ContainerResponseFilter {

@Override
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext)
        throws IOException {
    System.out.println("hell");
    responseContext.getHeaders().add("X-Powered-By", "Jersey :-)");

}

}

资源类:

@NameBinding
@Retention(value = RetentionPolicy.RUNTIME)
public @interface FrontierResponse {
}

@GET
@Produces("text/plain")
@Path("plain")
//@FrontierResponse
public String getMessage() {
    System.out.println("hello world called");
    return "Hello World";
}

最后我从浏览器调用它 http://localhost:4464/plain

于 2013-08-05T13:50:23.793 回答
0

ResourceConfig.PROPERTY_CONTAINER_RESPONSE_FILTERS属性添加为 ainit-param而不是 a context-param

...
adapter3.addInitParameter(ResourceConfig.PROPERTY_CONTAINER_RESPONSE_FILTERS, PoweredbyResponseFilter.class.getName());
...

编辑 1

从您的回答看来,您实际上是在尝试将 Jersey 1.x (1.17) 运行时与已实现的 JAX-RS 2.0 提供程序一起使用(ContainerRequestContext并且ContainerResponseContext已在 JAX-RS 2.0 中引入,而 Jersey 1.x 不知道如何使用他们)。

所以我的建议是 - 删除所有 Jersey 1.17 依赖项并用 Jersey 2.x 依赖项替换它们。查看我们的helloworld-webapp示例(特别是在App类中),了解如何使用 JAX-RS 应用程序创建 Grizzly 服务器实例。

请注意,只需将ServerProperties.PROVIDER_PACKAGES属性添加到init-params 就足够了,您的资源和提供者(包括响应过滤器)将被扫描并在应用程序中注册。

于 2013-08-05T11:04:26.597 回答