You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:27:29