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
相关产品推荐
相关产品推荐

