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

如何在现有Struts-1+Hibernate Web应用中集成Spring Boot开发Rest-API?

核心结论

Spring Boot 完全可以和你现有的这套Struts1老应用整合跑起来,二者本质都是基于Servlet规范实现的Web组件,只要把请求路由边界划清楚就能协同工作,不存在硬阻断的兼容性问题;只要依赖配置做对,也根本不会和你现在用的外置Tomcat9部署方式起冲突。

协同运行的核心逻辑

整套整合的核心是严格的请求路径隔离,两个前端Servlet各自处理匹配范围内的请求,完全不发生路由争抢:

  • 保留Struts1原本的ActionServlet拦截规则(默认匹配*.do后缀的所有老业务请求),完全不改动原有struts-config.xml、Action类、FormBean、老业务逻辑,所有老业务请求的处理流程和当前完全一致。
  • 由Spring Boot自带的DispatcherServlet处理所有新增的REST API请求(比如统一约定所有REST接口路径为/api/**)。依托Servlet容器的标准映射规则:后缀匹配(.do)的优先级高于根路径匹配(/),所以.do的请求永远优先走Struts1,未被更高优先级规则匹配的请求(比如/api/**)才会落到Spring的Servlet上处理,不会出现请求路由错配的问题。

具体配置调整步骤

1. 依赖版本选择与冲突规避

  • 必须选择Spring Boot 2.7.x 版本:这个版本基于Spring 5和javax.servlet规范实现,和Tomcat9(对应Servlet 4.0规范)、现有Struts1的依赖体系完全兼容;绝对不要选Spring Boot 3.x,该版本已经切换为jakarta.servlet命名空间,会直接导致现有Struts1的类加载失败。
  • 引入spring-boot-starter-web依赖后,必须将spring-boot-starter-tomcat的作用域设置为provided:这样打war包时不会把Spring Boot内嵌Tomcat的类打包进war包,部署到外置Tomcat9时不会出现类版本冲突,从根源上避免内嵌容器和外置容器的类加载冲突。
  • 完全保留现有Struts1、Hibernate的所有依赖,不要做版本升级或替换,避免老业务逻辑出现兼容性问题。

2. 新增配置类与文件

  • 新增Spring Boot启动类,必须继承SpringBootServletInitializer并重写configure方法:这样外置Tomcat启动war包时,才能正确加载Spring上下文,不需要依赖main方法的启动流程。
  • 对Spring Boot的组件扫描范围做严格限制:通过@SpringBootApplication(scanBasePackages = "你新增的REST接口所在的包路径")指定扫描范围,绝对不要扫描现有老业务代码的包路径,避免Spring误将Struts1的Action类纳入管理,引发组件生命周期冲突。
  • 保留现有web.xml的原有配置不变:
    • 保持Struts1的ActionServlet的url-pattern为原来的*.do映射,不要改动。
    • 在web.xml中注册Spring的DispatcherServlet,将其url-pattern设置为/,和Tomcat的Servlet映射逻辑对齐。

3. 业务逻辑复用适配

  • 现有Hibernate的SessionFactory可以直接被新的REST接口复用:不需要改动原有Hibernate的初始化逻辑,只要将已经初始化完成的SessionFactory通过Spring的@Bean注解注入到Spring上下文中,新的REST接口就可以直接注入使用,不需要重复做数据源配置。
  • 两个Servlet运行在同一个Tomcat容器中,天然共享HttpSession,老Struts应用里存储的用户登录态、权限信息,新的REST接口可以直接从请求中读取,不需要额外做会话打通的改造。

关于内嵌Tomcat与外置Tomcat的冲突说明

二者不会产生本质冲突,冲突的触发场景只有一种:打war包时未排除内嵌Tomcat的依赖类,导致外置Tomcat加载到重复的、版本不兼容的类。只要将spring-boot-starter-tomcat的scope设为provided:

  • 部署到外置Tomcat9时,Spring Boot的内嵌Tomcat组件完全不会被加载,所有Servlet都由外置Tomcat统一初始化管理,部署流程和现在的war包部署完全一致。
  • 后续如果需要切换为本地开发或独立部署场景,只要运行启动类的main方法,就可以由Spring Boot启动内嵌的Tomcat(只要将内嵌Tomcat的版本配置为9.x,和现有外置版本对齐),整个应用的Servlet路由规则因为基于通用Servlet规范,不需要做任何代码修改就可以直接运行。

避坑提醒

  • 不要随意修改Struts1的拦截路径:比如不要把*.do的映射改成根路径,会直接和Spring的DispatcherServlet形成路由抢占。
  • 静态资源路径要做明确区分:现有老应用的静态资源路径(比如/js/**、/css/**)要确认不会被Spring的静态资源映射规则拦截,如果有冲突就在Spring Boot配置中把对应的路径排除,避免老资源访问失效。
  • 不要在新的REST接口中直接注入Struts1的Action类:Struts1的Action是由Struts自己的控制器管理生命周期的,不由Spring容器管理,直接注入会出现空指针、重复初始化的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.28 14:36:04