Spring与Jersey整合遇阻:URL被拦截,二者能否共存?
Spring与Jersey共存完全可行,无需急着切换!
当然可以让Spring(用@RequestMapping的控制器)和Jersey的REST接口共存,不用立刻切换到Spring REST实现。你遇到的问题大概率是Spring的DispatcherServlet拦截了Jersey的请求路径,调整配置就能解决。
核心解决思路:让Spring和Jersey各自负责独立的URL路径
最稳妥的方式是给两者划分明确的路径职责,避免请求冲突:
调整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>
- 让Spring处理非API请求:
给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>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
相关产品推荐
相关产品推荐

