我正在处理一个需要在运行时解析数据库密码的项目。我通过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 实例上有几乎相同的配置。最重要的是,我在日志中没有看到任何与错误配置文件相关的线索。
阿晨1998
相关分类