Spring Boot 项目迁移到 TongWeb 7.0.4.2 详细指南
Spring Boot 项目迁移到 TongWeb 7.0.4.2 详细指南(基于 Spring Boot 2.1.3 + 达梦 V8)
本文档详细描述了如何将一个基于 Spring Boot 2.1.3 的 Web 应用迁移部署到 TongWeb 7.0.4.2 服务器,并对接达梦 V8 数据库的完整流程,包括项目改造、依赖冲突解决、多应用部署问题、达梦数据库配置踩坑、前端路由 404 处理以及带前缀访问问题等常见问题的解决方案。
一、Spring Boot 项目改造:从内嵌 Tomcat 迁移到 TongWeb(打包为 WAR)
TongWeb 是一款 Java EE 应用服务器(类似 WebLogic、WebSphere),不支持直接运行 Spring Boot 内嵌的 Tomcat,因此需要将 Spring Boot 项目改造成 WAR 包部署模式。
✅ 步骤 1:排除 Spring Boot 内嵌 Tomcat
在 pom.xml 中,排除默认的 spring-boot-starter-tomcat,避免与 TongWeb 的 Servlet 容器冲突:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- 去除内嵌 Tomcat -->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
✅ 不需要引入额外的
spring-boot-starter-tomcat或javax.servlet-api,TongWeb 会提供完整的 Servlet 容器支持。
✅ 步骤 2:修改打包方式为 WAR
在 pom.xml 的 <packaging> 标签中,将默认的 jar 改为 war:
<packaging>war</packaging>
✅ 步骤 3:修改 Spring Boot 启动类,继承 SpringBootServletInitializer
为了让 Spring Boot 应用能够在传统 Servlet 容器(如 TongWeb)中启动,需要让主类继承 SpringBootServletInitializer 并重写 configure 方法:
@SpringBootApplication
public class DemoApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(DemoApplication.class);
}
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
- 该方式同时支持:
- 直接运行 main 方法(内嵌容器,如测试环境)
- 打成 WAR 包后部署到 TongWeb(生产/预发布)
二、TongWeb 7.0.4.2 部署常见问题与解决方案
❗ 问题 1:java.lang.NoSuchMethodError: javax.validation.spi.ConfigurationState.getValueExtractors()Ljava/util/Set;
报错原因:
TongWeb 7 自带了 javax.validation(Bean Validation API)相关 jar 包,但是 版本与 Spring Boot 2.1.3 默认依赖的 validation-api 版本不一致(Spring Boot 2.1.3 默认使用 validation-api 2.0.1.Final,而 TongWeb 可能自带较低或冲突版本)。
典型错误信息:
Caused by: java.lang.ClassNotFoundException: javax.validation.ParameterNameProvider
解决方案:
📌 推荐方案:用你项目中引入的 validation-api(通常是 2.0.1.Final)替换 TongWeb lib 目录下的旧版本 validation-api.jar
操作步骤:
- 找到你项目依赖的
validation-api-2.0.1.Final.jar(一般在 Maven 本地仓库或项目的WEB-INF/lib下) - 进入 TongWeb 安装目录,找到
lib/目录 - 删除原有的 validation-api.jar(或类似名称的旧版 JAR)
- 将你项目使用的 validation-api-2.0.1.Final.jar 复制到 TongWeb 的 lib/ 目录下
✅ 这样可以保证 TongWeb 使用与 Spring Boot 兼容的 Bean Validation API 版本,避免 NoSuchMethodError 或 ClassNotFoundException。
❗ 问题 2:多应用部署时出现 JMX MBean 冲突
报错信息:
Unable to register MBean [...] nested exception is javax.management.InstanceAlreadyExistsException: ...
原因:
Spring Boot 默认开启 JMX(spring.jmx.enabled=true),当多个应用部署在同一个 TongWeb 容器中时,如果它们的 MBean Domain 相同(默认是应用类名或 Spring 上下文默认值),就会导致 MBean 注册冲突。
解决方案(任选其一):
✅ 办法一:全局关闭 JMX(推荐简单场景)
在 application.yml 或 application.properties 中添加:
spring:
jmx:
enabled: false
⚠️ 如果你的项目没有使用 JMX 监控、Spring Cloud 等依赖,可以直接关闭,避免冲突。
✅ 办法二:为每个应用设置不同的 JMX Domain(推荐多应用部署)
在每个应用的 application.yml 中设置唯一的 domain 名称,例如:
spring:
jmx:
default-domain: project1 # 项目1使用 project1
另一个应用则配置为:
spring:
jmx:
default-domain: project2 # 项目2使用 project2
✅ 这样每个应用的 MBean 会注册到不同的 JMX Domain 下,避免冲突。
三、达梦数据库(DM V8)配置踩坑指南
❗ 问题 1:TongWeb 不支持 log4jdbc
错误尝试写法:
datasource:
url: jdbc:log4jdbc:dm://127.0.0.1:5236/SYSDBA?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true
username: SYSDBA
password: SYSDBA
driver-class-name: net.sf.log4jdbc.DriverSpy
问题:
TongWeb 环境下,使用 log4jdbc 的 JDBC URL 前缀 (jdbc:log4jdbc:...) 会导致连接失败,且 TongWeb 官方未提供相关兼容性支持,目前无已知解决方案,不建议在 TongWeb 中使用 log4jdbc。
❗ 问题 2:将达梦驱动包直接放在项目 lib 目录并 pom 引入,却报 ClassNotFoundException
错误做法:
- 将
DmJdbcDriver18.jar放到项目的/lib文件夹 - 并在
pom.xml中引入依赖,但运行时仍报错:ClassNotFoundException: dm.jdbc.driver.DmDriver
原因:
TongWeb 对于非标准 Maven 仓库的 jar 包管理机制严格,仅靠 pom 引入但未正确安装到本地/私服 Maven 仓库时,TongWeb 可能无法正确加载驱动类。
✅ 正确做法:将达梦 JDBC 驱动安装到本地 Maven 仓库,并正确引入依赖
步骤 1:使用 Maven 命令将达梦驱动安装到本地仓库
mvn install:install-file \
-Dfile=/path/to/your/DmJdbcDriver18.jar \
-DgroupId=com.dm \
-DartifactId=DmJdbcDriver18 \
-Dversion=1.8 \
-Dpackaging=jar
📌 请将
/path/to/your/DmJdbcDriver18.jar替换为你本地的达梦 JDBC 驱动实际路径
步骤 2:在 pom.xml 中引入依赖
<dependency>
<groupId>com.dm</groupId>
<artifactId>DmJdbcDriver18</artifactId>
<version>1.8</version>
</dependency>
步骤 3:配置数据源(使用标准 JDBC URL)
datasource:
driver-class-name: dm.jdbc.driver.DmDriver
url: jdbc:dm://127.0.0.1:5236/SYSDBA?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true
username: SYSDBA
password: SYSDBA
✅ 使用
jdbc:dm://前缀,而不是 log4jdbc 的前缀,确保 TongWeb 能正确加载原生达梦驱动。
四、前端部署相关问题(配合 WAR 包部署)
❗ 问题 1:前端页面刷新出现 404
原因:
前端使用 React/Vue 等 SPA 框架,通过路由跳转时由前端 JS 控制,刷新页面时请求的是 后台真实路由,但 TongWeb(或后端服务)没有对应的 Servlet 或 Controller 处理该路径,导致 404。
解决方案:
修改 TongWeb 的默认错误页面配置,将 404 错误重定向到前端入口文件 index.html,让前端路由再次接管:
🔧 修改 TongWeb 安装目录下的配置文件:
TongWeb安装目录/conf/default-web.xml
添加如下配置:
<error-page>
<error-code>404</error-code>
<location>/index.html</location>
</error-page>
✅ 这样当访问一个未映射的后端路由时,TongWeb 会返回前端 index.html,然后由前端框架处理路由。
❗ 问题 2:前端部署带前缀(如 /app)导致资源/路由 404
原因:
如果前端项目打包时未正确设置 base 路径(比如部署在 TongWeb 的 /app 路径下),那么前端静态资源路径和路由跳转都会出错,导致 JS/CSS 加载失败或路由刷新 404。
解决方案:
请联系前端同学,在打包时指定正确的前缀(base path),例如:
- 如果部署路径是
http://xxx:port/app/,则前端打包时需要设置:- Vue:
publicPath: '/app/' - React: 设置
homepage: '/app'或使用 basename 配置路由
- Vue:
并且确保:
- 打包后的文件是直接打成 zip 后改名为 war,不是将外层文件夹再打成 zip
- 前端资源路径与 TongWeb 部署的 context path 保持一致
五、总结 Checklist ✅
| 步骤/问题 | 解决方案 |
|---|---|
| Spring Boot 改造为 WAR 部署 | 排除 tomcat、修改 packaging、启动类继承 SpringBootServletInitializer |
| TongWeb 与 validation-api 冲突 | 替换 TongWeb lib 下的 validation-api.jar 为项目使用的版本(如 2.0.1.Final) |
| TongWeb 多应用部署 JMX 冲突 | 关闭 jmx(spring.jmx.enabled=false) 或 设置不同的 spring.jmx.default-domain |
| 达梦数据库驱动问题 | 不要使用 log4jdbc;不要直接放 jar 包到项目;推荐用 mvn install 安装到达梦驱动到本地仓库,pom 正确引入,url 使用 jdbc:dm:// |
| 前端刷新 404 | 修改 TongWeb 的 default-web.xml,添加 404 路由指向 /index.html |
| 前端带前缀部署 404 | 前端打包时设置正确的 base path / homepage,并确保 war 包结构正确 |

浙公网安备 33010602011771号