我正在处理一个需要在运行时解析数据库密码的项目。我通过DataSourceFactory在 Tomcat 配置中指定 a 来有效地在本地执行此操作。此过程可防止任何凭据存储在纯文本配置文件中,并为我们提供了在运行时解析密码的自定义控件。我在本地取得了巨大的成功,但是当我将我的解决方案移动到 AWS 上的真实/非嵌入式 Tomcat 实例时,我看到了这个错误:无法在命名的工厂类“org.apache.openjpa.jdbc.kernel.JDBCBrokerFactory”上调用静态 newInstance 方法。首先,围绕此错误消息有一些可疑的细节。第一(如下所示),尽管其他凭据有效(例如用户名、密码等),但我的工厂类在 tomcat 配置文件中被忽略。我的代码DataSourceFactory需要引用一个类来解析一个值。这是我对 tomcat 的 xml 配置:<?xml version='1.0' encoding='UTF-8'?><Context useHttpOnly="false"> <Resource auth="Container" name="mail/Session" type="javax.mail.Session"/> <Resource name="jdbc/jndi" auth="Container" scope="Shareable" type="javax.sql.DataSource" useLocalSessionState="true" cacheServerConfiguration="true" useServerPrepStmts="true" cachePrepStmts="true" cacheCallableStmts="true" elideSetAutoCommits="true" alwaysSendSetIsolation="false" enableQueryTimeouts="false" prepStmtCacheSize="250" prepStmtCacheSqlLimit="2048" maxActive="100" maxIdle="20" maxWait="10000" removeAbandoned="true" driverClassName="com.mysql.jdbc.Driver" url="${myURL}" username="${myUsername}" password="${myPasswordToResolve}" factory="my.class.CustomDatabaseConfigurationFactory" testOnBorrow="true" testWhileIdle="true" timeBetweenEvictionRunsMillis="20000" poolPreparedStatements="true" maxOpenPreparedStatements="50" validationQuery="select 1" validationInterval="60000" defaultTransactionIsolation="READ_COMMITTED" />我不会添加我的代码,my.class.CustomDatabaseConfigurationFactory因为我知道它在本地工作。出于某种原因,当我使用远程配置和设置启动它时,Tomcat 完全忽略了我为 JNDI 资源设置的自定义工厂。有什么我必须添加的东西来强制 Tomcat 寻找我的自定义工厂而不是忽略它吗?我在本地的嵌入式 tomcat 实例上有几乎相同的配置。最重要的是,我在日志中没有看到任何与错误配置文件相关的线索。
1 回答
![?](http://img1.sycdn.imooc.com/545861f00001be3402200220-100-100.jpg)
阿晨1998
TA贡献2037条经验 获得超6个赞
实际上,当自定义数据工厂正在解析正确的密码时,绝不会发生此问题。
对于遇到此问题的其他人,请注意以下几点:
最重要的是,我在日志中没有看到任何与错误配置文件相关的线索。
这是一个致命的赠品,没有加载某些东西或没有正确设置记录器。在我意识到 log4j 没有正确配置后,我能够看到我的工厂实际上正在加载。后来,在看到结果后,我能够看到为数据库设置的密码不正确。
虽然日志错误级别太高,没有足够详细的信息,但这个问题可以通过基本的调试方法修复,并且可以通过注意日志来避免。
添加回答
举报
0/150
提交
取消