Spring Web应用从Tomcat迁移至WildFly部署报错求助
从你贴的错误栈里能一眼看出核心问题:WildFly应用服务器中没有配置jdbc/revomon_tracking和jdbc/tracking_position这两个JNDI数据源,导致Spring容器在初始化dataSource和dataSourcePosition这两个Bean时,找不到对应的JNDI资源,进而引发依赖注入失败,最终整个应用启动失败。
下面是一步步的解决方案:
1. 在WildFly中配置缺失的JNDI数据源
WildFly的数据源配置有两种常用方式,选你顺手的来:
方式一:通过WildFly管理控制台配置(图形化操作,更简单)
- 打开WildFly管理控制台(默认地址是
http://localhost:9990,需要先启用管理用户) - 导航到 Configuration > Subsystems > Datasources & Drivers > Datasources
- 点击
Add按钮,选择你使用的数据库类型(比如MySQL、PostgreSQL等),然后填写以下信息:- JNDI Name:必须严格和Spring配置里的一致,也就是
jdbc/revomon_tracking和jdbc/tracking_position - Connection URL:你的数据库连接地址(比如
jdbc:mysql://localhost:3306/revomon_tracking?useSSL=false) - Username/Password:数据库的登录凭证
- JNDI Name:必须严格和Spring配置里的一致,也就是
- 首先要确保对应的数据库驱动已经添加到WildFly中,如果没有,点击
Install Driver上传驱动jar包 - 配置完成后点击
Test Connection验证连接是否正常,没问题的话保存并启用数据源
方式二:手动修改WildFly配置文件(适合习惯命令行的开发者)
找到WildFly安装目录下的standalone/configuration/standalone.xml(如果是域模式则修改domain.xml),找到<datasources>节点,添加以下配置:
<!-- 配置jdbc/revomon_tracking数据源,以MySQL为例 --> <datasource jndi-name="jdbc/revomon_tracking" pool-name="revomon_tracking_pool" enabled="true" use-java-context="true"> <connection-url>jdbc:mysql://localhost:3306/revomon_tracking?useSSL=false&serverTimezone=UTC</connection-url> <driver-class>com.mysql.cj.jdbc.Driver</driver-class> <driver>mysql</driver> <!-- 这个名字要和下面<drivers>里的驱动名称一致 --> <security> <user-name>your_db_username</user-name> <password>your_db_password</password> </security> </datasource> <!-- 配置jdbc/tracking_position数据源 --> <datasource jndi-name="jdbc/tracking_position" pool-name="tracking_position_pool" enabled="true" use-java-context="true"> <connection-url>jdbc:mysql://localhost:3306/tracking_position?useSSL=false&serverTimezone=UTC</connection-url> <driver-class>com.mysql.cj.jdbc.Driver</driver-class> <driver>mysql</driver> <security> <user-name>your_db_username</user-name> <password>your_db_password</password> </security> </datasource>
同时,确保<drivers>节点下有对应数据库的驱动配置(以MySQL为例):
<driver name="mysql" module="com.mysql"> <driver-class>com.mysql.cj.jdbc.Driver</driver-class> <xa-datasource-class>com.mysql.cj.jdbc.MysqlXADataSource</xa-datasource-class> </driver>
如果是手动配置驱动,还需要把数据库驱动jar包放到WildFly的modules/system/layers/base/com/mysql/main目录下,并创建module.xml文件:
<?xml version="1.0" encoding="UTF-8"?> <module xmlns="urn:jboss:module:1.1" name="com.mysql"> <resources> <resource-root path="mysql-connector-java-8.0.33.jar" /> <!-- 替换成你的驱动版本 --> </resources> <dependencies> <module name="javax.api"/> <module name="javax.transaction.api"/> </dependencies> </module>
2. 验证Spring配置中的数据源引用
打开你的application-context-repository.xml,检查dataSource和dataSourcePosition的配置,确保JNDI名称和WildFly中配置的完全一致,并且添加resourceRef="true"适配Java EE容器的JNDI环境:
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName" value="jdbc/revomon_tracking" /> <property name="resourceRef" value="true" /> </bean> <bean id="dataSourcePosition" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName" value="jdbc/tracking_position" /> <property name="resourceRef" value="true" /> </bean>
3. 重启WildFly并重新部署应用
完成以上配置后,重启WildFly服务器,然后重新部署你的Spring应用,这个JNDI找不到的问题应该就能解决了。
补充说明:Tomcat和WildFly的数据源配置体系完全不同,Tomcat通常在context.xml中配置<Resource>,而WildFly使用自己的数据源管理机制,所以从Tomcat迁移到WildFly时,必须重新配置数据源,这是常见的迁移坑点。
内容的提问来源于stack exchange,提问作者user3383728

