ContainerResponseFilter在球衣1.17中的兼容性

时间:2013-08-05 04:57:11

标签: filter jersey containers response grizzly

我可以在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[]{"/"});

   ...
   .....

2 个答案:

答案 0 :(得分:0)

ResourceConfig.PROPERTY_CONTAINER_RESPONSE_FILTERS属性添加为init-param,而不是context-param

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

编辑1

从您的回答看来,您实际上尝试使用Jersey 1.x(1.17)运行时与已实现的JAX-RS 2.0提供程序(ContainerRequestContextContainerResponseContext已在JAX-RS中引入2.0和Jersey 1.x不知道如何使用它们。)

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

请注意,只需将ServerProperties.PROVIDER_PACKAGES属性添加到init-param即可,您的资源和提供商(包括响应过滤器)将在应用程序中进行扫描和注册。

答案 1 :(得分: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