diff --git a/data-agent-management/src/main/java/com/alibaba/cloud/ai/dataagent/entity/Datasource.java b/data-agent-management/src/main/java/com/alibaba/cloud/ai/dataagent/entity/Datasource.java index 8c79de9e3..67c68dc9b 100644 --- a/data-agent-management/src/main/java/com/alibaba/cloud/ai/dataagent/entity/Datasource.java +++ b/data-agent-management/src/main/java/com/alibaba/cloud/ai/dataagent/entity/Datasource.java @@ -17,6 +17,7 @@ import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Builder; import org.springframework.format.annotation.DateTimeFormat; @@ -45,7 +46,12 @@ public class Datasource { private String username; - @JsonIgnore + /** + * Password field is only writable (input only). + * It will not be returned in API responses for security reasons, + * but can be received from API requests. + */ + @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) private String password; @JsonIgnore diff --git a/data-agent-management/src/main/java/com/alibaba/cloud/ai/dataagent/service/datasource/handler/impl/OracleDatasourceTypeHandler.java b/data-agent-management/src/main/java/com/alibaba/cloud/ai/dataagent/service/datasource/handler/impl/OracleDatasourceTypeHandler.java index 7e41de0b1..1cdac5967 100644 --- a/data-agent-management/src/main/java/com/alibaba/cloud/ai/dataagent/service/datasource/handler/impl/OracleDatasourceTypeHandler.java +++ b/data-agent-management/src/main/java/com/alibaba/cloud/ai/dataagent/service/datasource/handler/impl/OracleDatasourceTypeHandler.java @@ -34,8 +34,14 @@ public String buildConnectionUrl(Datasource datasource) { return datasource.getConnectionUrl(); } // Oracle JDBC URL format: jdbc:oracle:thin:@host:port/serviceName + // databaseName may contain "serviceName|schemaName" format, extract serviceName part + String databaseName = datasource.getDatabaseName(); + String serviceName = databaseName; + if (databaseName != null && databaseName.contains("|")) { + serviceName = databaseName.split("\\|")[0]; + } return String.format("jdbc:oracle:thin:@%s:%d/%s", datasource.getHost(), datasource.getPort(), - datasource.getDatabaseName()); + serviceName); } @Override diff --git a/data-agent-management/src/main/java/com/alibaba/cloud/ai/dataagent/service/datasource/impl/DatasourceServiceImpl.java b/data-agent-management/src/main/java/com/alibaba/cloud/ai/dataagent/service/datasource/impl/DatasourceServiceImpl.java index e8100959a..0ea0ae83f 100644 --- a/data-agent-management/src/main/java/com/alibaba/cloud/ai/dataagent/service/datasource/impl/DatasourceServiceImpl.java +++ b/data-agent-management/src/main/java/com/alibaba/cloud/ai/dataagent/service/datasource/impl/DatasourceServiceImpl.java @@ -176,6 +176,12 @@ public boolean testConnection(Integer id) { * Actual connection test method */ private boolean realConnectionTest(Datasource datasource) { + // Validate password is not empty + if (datasource.getPassword() == null || datasource.getPassword().trim().isEmpty()) { + log.error("Password is empty for datasource: {}", datasource.getName()); + return false; + } + // Convert Datasource to DbConfig DbConfigBO config = new DbConfigBO(); DatasourceTypeHandler handler = datasourceTypeHandlerRegistry.getRequired(datasource.getType());