Spring Boot 2.1.8连接OCI带Wallet的数据源启动失败问题
问题场景
基于Spring Boot 2.1.8的Web应用需连接两个数据库,其中一个为OCI数据库并使用WALLET认证,启动时抛出jdbcUrl is required with driverClassName错误,导致应用启动失败。
现有配置
1. OCI数据源配置
#Configuration to OCI datasource1.spring.datasource.driver-class-name=oracle.jdbc.OracleDriver datasource1.spring.datasource.jdbc-url=jdbc:oracle:thin:@bddociaddv?TNS_ADMIN=/u02/Admin/domains/domain1/wls12c/props/bddoci datasource1.spring.datasource.username=username datasource1.spring.datasource.password=pass
注:jdbc-url中TNS_ADMIN指向已解压Wallet配置文件的文件夹
2. POM依赖配置
<!-- Uncomment this when using Oracle Credentials Wallet --> <dependency> <groupId>com.oracle.ojdbc</groupId> <artifactId>ojdbc8</artifactId> <version>${oracle.ojdbc.version}</version> <exclusions> <exclusion> <groupId>com.oracle.ojdbc</groupId> <artifactId>simplefan</artifactId> </exclusion> <exclusion> <groupId>com.oracle.ojdbc</groupId> <artifactId>ons</artifactId> </exclusion> </exclusions> </dependency>
其中
${oracle.ojdbc.version}取值范围为[19,20)
错误日志
Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled. 2024-05-17 16:22:19,040 ERROR org.springframework.boot.SpringApplication [[ACTIVE] ExecuteThread: '11' for queue: 'weblogic.kernel.Default (self-tuning)'] Application run failed # org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'xxxxxxEntityManagerFactory' defined in class path resource [com/domain/subdomain/repository1/model/XXXXXXDatasourceConfiguration.class]: Unsatisfied dependency expressed through method 'XXXXXXXEntityManagerFactory' parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'entityManagerFactoryBuilder' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Unsatisfied dependency expressed through method 'entityManagerFactoryBuilder' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jpaVendorAdapter' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.orm.jpa.JpaVendorAdapter]: Factory method 'jpaVendorAdapter' threw exception; nested exception is java.lang.IllegalArgumentException: **jdbcUrl is required with driverClassName.**
解决方案
1. 修正配置文件前缀
当前配置前缀datasource1.spring.datasource不符合Spring Boot多数据源配置规范,需去掉多余的spring.,修改为:
#Configuration to OCI datasource1.datasource.driver-class-name=oracle.jdbc.OracleDriver datasource1.datasource.jdbc-url=jdbc:oracle:thin:@bddociaddv?TNS_ADMIN=/u02/Admin/domains/domain1/wls12c/props/bddoci datasource1.datasource.username=username datasource1.datasource.password=pass
自定义多数据源配置类通常使用@ConfigurationProperties(prefix = "datasource1.datasource")绑定配置,多余的spring.会导致配置无法被正确读取,进而触发jdbcUrl缺失错误。
2. 检查数据源配置类的属性绑定
确保XXXXXXDatasourceConfiguration类中,数据源Bean的配置正确使用@ConfigurationProperties,且前缀与配置文件一致:
@Configuration @EnableJpaRepositories(basePackages = "com.domain.subdomain.repository1", entityManagerFactoryRef = "xxxxxxEntityManagerFactory", transactionManagerRef = "xxxxxxTransactionManager") public class XXXXXXDatasourceConfiguration { @Bean @ConfigurationProperties(prefix = "datasource1.datasource") public DataSource datasource1() { return DataSourceBuilder.create().build(); } // EntityManagerFactory、TransactionManager配置省略... }
若配置类中前缀写错,会导致配置无法正确绑定,需严格与配置文件前缀匹配。
3. 验证Wallet文件权限与路径
确认应用进程有权限访问TNS_ADMIN指向的文件夹及其中的Wallet文件(如cwallet.sso、tnsnames.ora等),路径不存在或权限不足可能间接引发配置读取异常。可执行以下命令检查:
ls -l /u02/Admin/domains/domain1/wls12c/props/bddoci
4. 补充Wallet依赖(可选)
使用Wallet认证时,建议补充以下Oracle Wallet相关依赖,确保版本与ojdbc匹配:
<dependency> <groupId>com.oracle.database.security</groupId> <artifactId>oraclepki</artifactId> <version>${oracle.ojdbc.version}</version> </dependency> <dependency> <groupId>com.oracle.database.security</groupId> <artifactId>osdt_core</artifactId> <version>${oracle.ojdbc.version}</version> </dependency> <dependency> <groupId>com.oracle.database.security</groupId> <artifactId>osdt_cert</artifactId> <version>${oracle.ojdbc.version}</version> </dependency>
这些依赖是OCI Wallet认证的必要组件,可避免后续出现认证相关错误。
内容的提问来源于stack exchange,提问作者Joaquín Figueroa Arrué

