From 18c354c60082d54eef08baa1f3f2b3f75cafa9f9 Mon Sep 17 00:00:00 2001 From: ViacheslavKlimov Date: Mon, 29 Jan 2024 11:12:51 +0200 Subject: [PATCH] Proper SQL error instead of 'could not extract ResultSet' --- .../server/controller/BaseController.java | 24 +++++++++++++------ 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/controller/BaseController.java b/application/src/main/java/org/thingsboard/server/controller/BaseController.java index f12a20094d..414d13a714 100644 --- a/application/src/main/java/org/thingsboard/server/controller/BaseController.java +++ b/application/src/main/java/org/thingsboard/server/controller/BaseController.java @@ -16,14 +16,16 @@ package org.thingsboard.server.controller; import com.fasterxml.jackson.databind.node.ObjectNode; -import com.google.common.util.concurrent.FutureCallback; -import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; -import com.google.common.util.concurrent.MoreExecutors; import lombok.Getter; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.exception.ExceptionUtils; +import org.postgresql.util.PSQLException; +import org.postgresql.util.ServerErrorMessage; import org.slf4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; +import org.springframework.dao.DataAccessException; import org.springframework.http.MediaType; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; @@ -46,7 +48,6 @@ import org.thingsboard.server.common.data.HasName; import org.thingsboard.server.common.data.HasTenantId; import org.thingsboard.server.common.data.OtaPackage; import org.thingsboard.server.common.data.OtaPackageInfo; -import org.thingsboard.server.common.data.StringUtils; import org.thingsboard.server.common.data.TbResource; import org.thingsboard.server.common.data.TbResourceInfo; import org.thingsboard.server.common.data.Tenant; @@ -170,7 +171,7 @@ import java.util.function.BiFunction; import java.util.function.Function; import java.util.stream.Collectors; -import static org.thingsboard.server.common.data.StringUtils.isNotEmpty; +import static org.apache.commons.lang3.StringUtils.isNotEmpty; import static org.thingsboard.server.common.data.query.EntityKeyType.ENTITY_FIELD; import static org.thingsboard.server.controller.UserController.YOU_DON_T_HAVE_PERMISSION_TO_PERFORM_THIS_OPERATION; import static org.thingsboard.server.dao.service.Validator.validateId; @@ -376,9 +377,18 @@ public abstract class BaseController { return new ThingsboardException("Unable to send mail: " + exception.getMessage(), ThingsboardErrorCode.GENERAL); } else if (exception instanceof AsyncRequestTimeoutException) { return new ThingsboardException("Request timeout", ThingsboardErrorCode.GENERAL); - } else { - return new ThingsboardException(exception.getMessage(), exception, ThingsboardErrorCode.GENERAL); + } else if (exception instanceof DataAccessException) { + Throwable rootCause = ExceptionUtils.getRootCause(exception); + if (rootCause instanceof PSQLException) { + String sqlError = Optional.ofNullable(((PSQLException) rootCause).getServerErrorMessage()) + .map(ServerErrorMessage::getMessage).orElse(null); + if (isNotEmpty(sqlError)) { + sqlError = StringUtils.capitalize(sqlError); + return new ThingsboardException(sqlError, ThingsboardErrorCode.GENERAL); + } + } } + return new ThingsboardException(exception.getMessage(), exception, ThingsboardErrorCode.GENERAL); } /**