如何通过TomEE.xml配置HikariCP?启动遇MissingFactoryMethodException报错求助
解决TomEE中配置HikariCP数据源时的MissingFactoryMethodException错误
我之前在TomEE里配置HikariCP的时候也踩过这个坑,这个MissingFactoryMethodException其实是因为TomEE(基于OpenEJB)对JNDI资源工厂的方法签名有严格要求,而HikariCP自带的HikariJNDIFactory不符合这个要求导致的——TomEE要求工厂方法必须是**public static Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable<?,?> environment)**这样的静态方法,但Hikari的getObjectInstance是实例方法,自然会被TomEE判定为“找不到符合要求的工厂方法”。
下面给你两种可行的解决办法:
方案一:用TomEE内置的HikariCP集成(推荐)
TomEE 8及以上版本已经原生支持HikariCP,完全不需要手动把Hikari的jar包丢到lib目录,直接用TomEE标准的数据源配置语法就行,核心是指定DataSourceCreator = hikari来启用HikariCP作为数据源实现:
<Resource id="myJtaDs" type="javax.sql.DataSource"> <!-- 数据库驱动类 --> JdbcDriver = com.mysql.cj.jdbc.Driver <!-- 数据库连接URL --> JdbcUrl = jdbc:mysql://localhost:3306/your_database <!-- 数据库账号密码 --> UserName = your_db_user Password = your_db_pass <!-- 开启JTA管理(如果需要分布式事务) --> JtaManaged = true <!-- 关键:指定用HikariCP创建数据源 --> DataSourceCreator = hikari <!-- 可以添加HikariCP的自定义配置,比如连接池大小 --> maximumPoolSize = 20 minimumIdle = 5 </Resource>
这种方式最省心,TomEE会自动处理所有适配逻辑,不用管工厂类的问题。
方案二:自定义适配工厂类(适合必须手动引入Hikari jar的场景)
如果因为项目限制必须手动引入HikariCP的jar包,那你需要写一个简单的适配类,把Hikari的实例方法转成TomEE要求的静态方法:
import com.zaxxer.hikari.HikariJNDIFactory; import javax.naming.Context; import javax.naming.Name; import javax.naming.NamingException; import java.util.Hashtable; public class TomEEHikariAdapterFactory { public static Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable<?,?> environment) throws NamingException { // 实例化Hikari的工厂类,调用它的实例方法 HikariJNDIFactory hikariFactory = new HikariJNDIFactory(); return hikariFactory.getObjectInstance(obj, name, nameCtx, environment); } }
做完这两步:
- 把这个类编译后,放到TomEE的
lib目录,或者你的应用的WEB-INF/classes目录下 - 修改你的资源配置,指定这个自定义工厂类:
<Resource id="myJtaDs" type="DataSource" class-name="com.yourpackage.TomEEHikariAdapterFactory" factory-name="getObjectInstance"> <!-- HikariCP的原生配置参数 --> jdbcUrl = jdbc:mysql://localhost:3306/your_database username = your_db_user password = your_db_pass driverClassName = com.mysql.cj.jdbc.Driver maximumPoolSize = 20 </Resource>
额外注意事项
- 手动引入HikariCP jar时,要注意版本兼容性:TomEE 8推荐用HikariCP 3.x系列,TomEE 9+适配HikariCP 4.x版本
- 别忘了把对应的数据库驱动jar(比如mysql-connector-java.jar)也放到TomEE的
lib目录里
内容的提问来源于stack exchange,提问作者Runar Halse
相关产品推荐
相关产品推荐

