我可以在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[]{"/"});
...
.....
答案 0 :(得分:0)
将ResourceConfig.PROPERTY_CONTAINER_RESPONSE_FILTERS属性添加为init-param
,而不是context-param
:
...
adapter3.addInitParameter(ResourceConfig.PROPERTY_CONTAINER_RESPONSE_FILTERS, PoweredbyResponseFilter.class.getName());
...
从您的回答看来,您实际上尝试使用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-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