为了账号安全,请及时绑定邮箱和手机立即绑定

Java Spring Tomcat:自定义数据源工厂被忽略

Java Spring Tomcat:自定义数据源工厂被忽略

缥缈止盈 2021-06-07 13:34:59
我正在处理一个需要在运行时解析数据库密码的项目。我通过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 回答

?
阿晨1998

TA贡献2037条经验 获得超6个赞

实际上,当自定义数据工厂正在解析正确的密码时,绝不会发生此问题。

对于遇到此问题的其他人,请注意以下几点:

最重要的是,我在日志中没有看到任何与错误配置文件相关的线索。

这是一个致命的赠品,没有加载某些东西或没有正确设置记录器。在我意识到 log4j 没有正确配置后,我能够看到我的工厂实际上正在加载。后来,在看到结果后,我能够看到为数据库设置的密码不正确。

虽然日志错误级别太高,没有足够详细的信息,但这个问题可以通过基本的调试方法修复,并且可以通过注意日志来避免。


查看完整回答
反对 回复 2021-06-10
  • 1 回答
  • 0 关注
  • 171 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信