猿问

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

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


缥缈止盈
浏览 172回答 1
1回答

阿晨1998

实际上,当自定义数据工厂正在解析正确的密码时,绝不会发生此问题。对于遇到此问题的其他人,请注意以下几点:最重要的是,我在日志中没有看到任何与错误配置文件相关的线索。这是一个致命的赠品,没有加载某些东西或没有正确设置记录器。在我意识到 log4j 没有正确配置后,我能够看到我的工厂实际上正在加载。后来,在看到结果后,我能够看到为数据库设置的密码不正确。虽然日志错误级别太高,没有足够详细的信息,但这个问题可以通过基本的调试方法修复,并且可以通过注意日志来避免。
随时随地看视频慕课网APP

相关分类

Java
我要回答