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

Spring与Jersey整合遇阻:URL被拦截,二者能否共存?

Spring与Jersey共存完全可行,无需急着切换!

当然可以让Spring(用@RequestMapping的控制器)和Jersey的REST接口共存,不用立刻切换到Spring REST实现。你遇到的问题大概率是Spring的DispatcherServlet拦截了Jersey的请求路径,调整配置就能解决。

核心解决思路:让Spring和Jersey各自负责独立的URL路径

最稳妥的方式是给两者划分明确的路径职责,避免请求冲突:

  1. 调整Spring DispatcherServlet的URL映射
    如果你当前Spring的DispatcherServlet用的是/*(会拦截所有请求),改成更具体的路径,比如:

    • 让Spring处理非API请求:/*.html、/*.jsp,或者直接用/(Spring会默认处理根路径下除了其他Servlet匹配的请求)
    • 示例web.xml配置:
      <servlet>
          <servlet-name>springDispatcher</servlet-name>
          <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
          <!-- 其他Spring初始化配置 -->
      </servlet>
      <servlet-mapping>
          <servlet-name>springDispatcher</servlet-name>
          <url-pattern>/</url-pattern>
      </servlet-mapping>
      
  2. 给Jersey Servlet指定专属API路径
    配置Jersey的Servlet(比如org.glassfish.jersey.servlet.ServletContainer)处理特定前缀的请求,比如/api/*,这样Spring就不会拦截这些请求了:
    示例web.xml配置:

    <servlet>
        <servlet-name>jerseyServlet</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>com.yourpackage.jersey.controllers</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>jerseyServlet</servlet-name>
        <url-pattern>/api/*</url-pattern>
    </servlet-mapping>
    
  3. Spring Boot环境下的配置方式
    如果是Spring Boot项目,不用写web.xml,直接注册Jersey的ServletRegistrationBean:

    @Configuration
    public class JerseyConfig {
        @Bean
        public ServletRegistrationBean<ServletContainer> jerseyServlet() {
            ServletRegistrationBean<ServletContainer> registration = new ServletRegistrationBean<>(
                new ServletContainer(new ResourceConfig().packages("com.yourpackage.jersey.controllers")),
                "/api/*"
            );
            registration.setLoadOnStartup(1);
            return registration;
        }
    }
    

关于是否要切换到Spring REST?

这取决于你的具体场景:

  • 如果现有Jersey代码量不大,或者团队更熟悉Spring MVC的生态(比如Spring Security、Spring Data等整合),切换到Spring REST(@RestController)会更统一,减少技术栈复杂度。
  • 如果Jersey的代码已经很成熟,且依赖Jersey的特定功能(比如JAX-RS的一些高级特性),完全没必要切换,共存方案足够稳定。

额外注意:Spring过滤器的路径

如果你的Spring过滤器用了/*的映射,要确保它不会干扰Jersey的请求。可以调整过滤器的url-pattern为Spring负责的路径,或者在过滤器逻辑里放行/api/*开头的请求。

内容的提问来源于stack exchange,提问作者JavaSheriff

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:46:50