Skip to content

fix(datasource): rebuild connection url when params change (#345)#537

Open
wsyjh8 wants to merge 1 commit into
spring-ai-alibaba:mainfrom
wsyjh8:fix/345-datasource-update-connection-url
Open

fix(datasource): rebuild connection url when params change (#345)#537
wsyjh8 wants to merge 1 commit into
spring-ai-alibaba:mainfrom
wsyjh8:fix/345-datasource-update-connection-url

Conversation

@wsyjh8

@wsyjh8 wsyjh8 commented Jun 6, 2026

Copy link
Copy Markdown

这个 PR 做了什么 / 为什么需要

updateDatasource 之前直接使用 resolveConnectionUrl:当客户端带回原有 connectionUrl 时会原样保存,导致修改 databaseName / host / port 后,URL 中的库名等不随之更新(#345)。

这是 service 层的契约问题,而不仅是 UI 问题:#484 将 connectionUrl 标记为 @JsonProperty(WRITE_ONLY) 后,自带 UI 的 GET 不再返回 URL、提交时该字段为空,从而掩盖了 UI 上的症状;但 REST / MCP 等直接携带 URL 的调用方仍可稳定复现。

本 PR 在连接参数发生变化时,按参数重新生成连接 URL。

是否修复了某个 issue?

Fixes #345

如何实现的

  • updateDatasource:当 existing != null、handler 具备必需连接字段、且连接参数(type / host / port / databaseName)发生变化时,调用 buildConnectionUrl 按参数重建;否则保留 resolveConnectionUrl 的结果,避免覆盖用户手动填写的自定义 URL。
  • 仅采用「能完整拼出、且不会把复合 databaseName 泄漏进 URL」的重建结果:当重建结果包含 | 时回退到 resolveConnectionUrl、保留原 URL。目前 Oracle 的 databaseName 形如 service|schema,朴素重建会把 |schema 拼进 URL,此守卫可避免拼坏。
  • Oracle URL 的完整(去 schema)重建由 fix(connector): fix Oracle database connection URL build and password… #509 负责;fix(connector): fix Oracle database connection URL build and password… #509 合并后其重建结果不再含 |,本逻辑会自动采用,无需后续改动。
  • 仅改动 service 层,不修改任何 handler。
  • 边界说明:参数变化时会以重建结果覆盖客户端带回的 URL(包括自定义 URL),这是本修复的预期行为;SQL Server 没有参数化的 URL 构造(未覆写 buildConnectionUrl),本 PR 不改变其现有行为,为其补充 URL 构造属于独立增强。

如何验证

新增 DatasourceServiceImplTest 用例:

  • updateDatasource_rebuildsConnectionUrlWhenDatabaseNameChanges:MySQL 修改库名后 URL 反映新库名(复现 [BUG] 数据源模块,修改数据库名,url中的库名不会跟着变更 #345)。
  • updateDatasource_preservesCustomUrlWhenParamsUnchanged:参数未变化时保留用户自定义 URL。
  • updateDatasource_preservesUrlForCompositeDatabaseName:Oracle service|schema 仅 schema 变化时保留原 URL,不被拼坏。
  • updateDatasource_rebuildsUrlForPostgresCompositeDatabaseName:PostgreSQL db|schema 修改库名时正常重建,且 | 不泄漏进 URL(验证守卫未误伤 PostgreSQL)。

执行以下命令通过:

  • ./mvnw.cmd -pl data-agent-management test -Dtest=DatasourceServiceImplTest -Dcheckstyle.skip=true
  • ./mvnw.cmd -pl data-agent-management test -Dtest=DatasourceServiceImplTest,DatasourceControllerTest,*DatasourceTypeHandlerTest,DatasourceTypeHandlerRegistryTest -DfailIfNoTests=false
  • ./mvnw.cmd -pl data-agent-management spotless:check
  • ./mvnw.cmd -pl data-agent-management checkstyle:check

给 reviewer 的特别说明

@wsyjh8 wsyjh8 marked this pull request as ready for review June 6, 2026 23:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[BUG] 数据源模块,修改数据库名,url中的库名不会跟着变更

1 participant