You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring5+Testcontainers Oracle-XE集成测试遇ORA-28040认证协议不匹配

ORA-28040: No matching authentication protocol 问题排查(Testcontainers + Spring 5.3 + Oracle)

我在为基于Spring 5.3和Oracle 12C的项目配置Testcontainers执行集成测试时,每次运行测试都会报错:ORA-28040: No matching authentication protocol。

生产环境数据库配置

生产环境通过NamedParameterJdbcTemplate访问数据库,配置如下:

<tx:annotation-driven proxy-target-class="true"
        transaction-manager="transactionManager" />
    
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> 
    <property name="jndiName" value="${connectionDataSource}" /> 
</bean>

<bean id="transactionManager"
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource">
        <ref bean="dataSource" />
    </property>
</bean>

<bean class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate" id="namedParameterJdbcTemplate">
     <constructor-arg ref="dataSource"/>
</bean> 

其中connectionDataSource的值为jdbc/myproject,指向Bea Weblogic 12.2应用服务器中配置的连接。

测试环境数据源配置(test-applicationContext-resources.xml)

我在单独的测试配置文件中配置了Testcontainers数据源:

<tx:annotation-driven proxy-target-class="true"
                      transaction-manager="transactionManager" />

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="org.testcontainers.jdbc.ContainerDatabaseDriver"/>
    <property name="url" value="jdbc:tc:oracle:21-slim-faststart:///myproject?TC_INITSCRIPT=/myproject.sql"/>
    <property name="username" value="myproject"/>
    <property name="password" value="myproject"/>
</bean>

<bean id="transactionManager"
      class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource">
        <ref bean="dataSource" />
    </property>
</bean>

<bean class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate" id="namedParameterJdbcTemplate">
    <constructor-arg ref="dataSource"/>
</bean>

测试类代码

测试类的实现如下:

@ExtendWith(SpringExtension.class)
@ContextConfiguration(locations = {"classpath:test-applicationContext-resources.xml"})
@WebAppConfiguration
@Testcontainers
class MyProjectTest {
    @Autowired
    MyProjectDAO myProjectDAO;

    @Test
    void test() {
        int userNumber = myProjectDAO.countUsers();
        assertEquals(1, userNumber);
    }
}

已尝试的操作

  • 移除测试数据源配置中的username、password以及driverClassName属性,问题依旧存在;
  • 生产环境使用的JDBC驱动依赖为:
    testRuntime group: 'com.oracle', name: 'ojdbc', version: '6'
    
    不确定该驱动版本是否是问题根源。

已知可能的解决方向

搜索发现设置SQLNET.ALLOWED_LOGON_VERSION=8可能解决该问题,但不清楚如何在Testcontainers的Oracle镜像中配置这个参数。

内容的提问来源于stack exchange,提问作者karmapolice

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 22:16:35