Jersey 1.x中ResourceConfig无register方法时,如何注册ContainerResponseFilter?
在Jersey 1.x中注册ContainerResponseFilter的两种方法
在Jersey 1.x里注册ContainerResponseFilter这类提供者确实和2.x版本不一样——早期的ResourceConfig确实没有register()方法。我给你两种靠谱的解决方案,你可以根据自己的场景选择:
1. 编程式注册(通过自定义ResourceConfig子类)
Jersey 1.x的ResourceConfig允许通过重写getClasses()或getSingletons()方法来手动注册提供者。具体步骤如下:
首先创建一个继承自ResourceConfig的自定义类,在构造方法里添加你的过滤器:
import com.sun.jersey.api.core.ResourceConfig; import com.yourpackage.MyFilter; public class MyJerseyApplication extends ResourceConfig { public MyJerseyApplication() { // 方式1:注册过滤器的Class(Jersey会自动实例化它) getClasses().add(MyFilter.class); // 方式2:如果需要注册单例实例(比如过滤器有自定义构造逻辑),用下面的代码 // getSingletons().add(new MyFilter()); } }
然后根据你的部署方式启用这个自定义配置:
- Web容器部署(比如Tomcat):在
web.xml里指定ResourceConfig类:<servlet> <servlet-name>JerseyApp</servlet-name> <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> <init-param> <param-name>com.sun.jersey.config.property.resourceConfigClass</param-name> <param-value>com.yourpackage.MyJerseyApplication</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>JerseyApp</servlet-name> <url-pattern>/api/*</url-pattern> </servlet-mapping> - 嵌入式服务器(比如Jetty):直接实例化自定义ResourceConfig并传入ServletContainer:
ServletContainer jerseyServlet = new ServletContainer(new MyJerseyApplication()); // 将jerseyServlet添加到嵌入式服务器的上下文里
2. 注解式注册(@Provider)
你已经尝试用@Provider注解了,但可能因为Jersey没扫描到你的过滤器类导致没生效。要让@Provider生效,需要确保Jersey能扫描到过滤器所在的包:
步骤1:确保过滤器类正确添加@Provider注解
你的代码基本没问题,注意ContainerResponseFilter的方法签名在Jersey 1.x里是这样的(别漏了第二个参数):
import com.sun.jersey.spi.container.ContainerRequest; import com.sun.jersey.spi.container.ContainerResponse; import com.sun.jersey.spi.container.ContainerRequestFilter; import com.sun.jersey.spi.container.ContainerResponseFilter; import javax.ws.rs.ext.Provider; @Provider public class MyFilter implements ContainerRequestFilter, ContainerResponseFilter { @Override public ContainerRequest filter(ContainerRequest containerRequest) { // 请求过滤逻辑 return containerRequest; } @Override public ContainerResponse filter(ContainerRequest containerRequest, ContainerResponse containerResponse) { // 响应过滤逻辑 return containerResponse; } }
步骤2:配置Jersey扫描指定包
在web.xml里添加com.sun.jersey.config.property.packages参数,指定Jersey要扫描的包(多个包用分号分隔):
<servlet> <servlet-name>JerseyApp</servlet-name> <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> <init-param> <param-name>com.sun.jersey.config.property.packages</param-name> <param-value>com.yourpackage.filters;com.yourpackage.resources</param-value> </init-param> </servlet>
这样Jersey启动时会自动扫描指定包下所有带@Provider注解的类,并注册为提供者。
内容的提问来源于stack exchange,提问作者YerivanLazerev
相关产品推荐
相关产品推荐

