我有一个现有的 Spring Boot 2.6.2 微服务,我们希望将调用添加到一个新的数据源。该服务将部署到使用 Java 8 的 Openliberty 23.0.0.10。我创建了一个新的 DAO:
public class iSeriesDatabaseDao {
@Autowired
private JdbcTemplate jdbcTemplate;
public String getPhoneNumber(String number)
抛出 SSOServiceException {
try {
String sqlString = String.join(" "、
"SELECT phone AS SPECIALITY, (wrkph1 CONCAT wrkph2 CONCAT wrkph3) AS PHONE FROM PRVMAS where PROVNO = '%s'");
String getPhone = String.format(sqlString,number);
return String.valueOf(jdbcTemplate.queryForList(getPhone));
} catch (Exception e) {
throw new SSOServiceException("Error in the query the
配置表时出错:" + e.getMessage());
}
}
我已经更新了服务器.xml。
我已更新了 server.xml,以说明新的 JDBC 驱动程序和数据源连接。
<jdbcDriver id="DB2iSeries">;
<library name="DB2iToolboxLib">;
<fileset dir="${wlp.user.dir}/shared/resources" includes="jt400.jar" />;
</library>;
</jdbcDriver>;
<代码<dataSource jdbcDriverRef="DB2iSeries" jndiName="jdbc/iSeriesDataSource">; <properties serverName="${env.DB_ISERIES_URL}" password="${env.DB_ISERIES_PWD}" user="${env.DB_USERID}" />; </dataSource>;
我还更新了我的 application.properties 文件。
spring.datasource.jndi-name=jdbc/PostgresSQLDataSource spring.datasource.jndi-name-iSeries=jdbc/iSeriesDataSource
当我测试我的代码时,我得到了以下错误信息。
[ERROR ] 连接错误: SSL error: sun.security.validator.ValidatorException:PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target [ERROR ] Failed to create a ConnectionPoolDataSource from PostgreSQL JDBC Driver 42.1.4 for user_xxx at jdbc:postgresql://Dev.xxx.com:3306/xxx?prepareThreshold=5&preparedStatementCacheQueries=256&preparedStatementCacheSizeMiB=5&databaseMetadataCacheFields=65536&databaseMetadataCacheFieldsMiB=5&defaultRowFetchSize=0&binaryTransfer=true&;readOnly=false&binaryTransferEnable=&binaryTransferDisable=&unknownLength=2147483647&logUnclosedConnections=false&disableColumnSanitiser=false&ssl=true&tcpKeepAlive=false&;loginTimeout=0&connectTimeout=10&socketTimeout=0&cancelSignalTimeout=10&receiveBufferSize=-1&sendBufferSize=-1&ApplicationName=PostgreSQL JDBC Driver&useSpnego=false&gsslib=auto&;sspiServiceClass=POSTGRES&allowEncodingChanges=false&targetServerType=any&loadBalanceHosts=false&hostRecheckSeconds=10&preferQueryMode=extended&autosave=never&reWriteBatchedInserts=false:org.postgresql.util.PSQLException:SSL error: sun.security.validator.ValidatorException:PKIX 路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到指向请求目标的有效认证路径。 at org.postgresql.ssl.MakeSSL.convert(MakeSSL.java:67) at org.postgresql.core.v3.ConnectionFactoryImpl.enableSSL(ConnectionFactoryImpl.java:359) at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:148) at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:49) at org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:194) at org.postgresql.Driver.makeConnection(Driver.java:450)
此处引用的 PostgreSQL 数据库是一个现有连接,而不是我的新连接。PostgreSQL 连接运行正常。设置新的 iSeries 连接还需要进行哪些更改?
你的问题似乎是你的Spring Boot应用无法建立与PostgreSQL数据库的SSL连接,而不是iSeries的配置问题。错误信息清楚地表明了“PKIX路径构建失败”,这意味着你的应用无法验证PostgreSQL服务器提供的SSL证书。
以下是解决此错误的步骤:
获取PostgreSQL服务器的SSL证书: 你需要从PostgreSQL服务器获取SSL证书。这可以通过多种方式实现,具体取决于你的服务器配置。一种常见的方法是使用以下OpenSSL命令:
bash openssl s_client -showcerts -connect your_postgres_server:5432 < /dev/null | openssl x509 -outform PEM > postgresql_server.crt
将your_postgres_server
替换为你的PostgreSQL服务器地址和端口。导入证书到你的Java密钥库: 你需要将获取的SSL证书导入到你的Java运行时环境使用的信任库中。你可以使用
keytool
命令行工具来完成此操作:bash keytool -import -trustcacerts -alias postgresql_server -file postgresql_server.crt -keystore $JAVA_HOME/jre/lib/security/cacerts
你可能需要提供密钥库的密码(默认密码为changeit
)。验证你的
application.properties
文件: 确保你的application.properties
文件中没有与PostgreSQL数据库相关的其他SSL配置冲突。完成这些步骤后,重新启动你的Spring Boot应用,它应该能够成功建立与PostgreSQL数据库的SSL连接。
关于iSeries连接的注意事项:
- 确保你的
jt400.jar
文件位于wlp.user.dir/shared/resources
目录中,并且你的server.xml
文件中配置的路径正确。 - 你可能需要添加一个
@Repository
注解到你的iSeriesDatabaseDao
类,以便Spring Boot可以自动扫描并配置它。 - 你可以使用
@Qualifier
注解来区分iSeriesDataSource
和PostgresSQLDataSource
,例如:java @Autowired @Qualifier("iSeriesDataSource") private JdbcTemplate jdbcTemplate;
- 确保你的iSeries数据库连接信息(例如URL、用户名和密码)在你的
application.properties
文件中正确配置。
如果在完成上述步骤后仍然遇到问题,请提供以下信息:
- 你使用的iSeries驱动程序的版本
- 你的
application.properties
文件的完整内容(删除敏感信息) - 你在尝试连接到iSeries数据库时遇到的任何其他错误消息