From 2c3b2822c20e31e6e4f629d693c1612200bd1e74 Mon Sep 17 00:00:00 2001 From: Mikhail Trofimov Date: Tue, 30 Sep 2025 14:20:45 +0300 Subject: [PATCH] http://jira.mfd.msk:8088/browse/BKI-3215 Moved SignalServerException logs to GlobalExceptionHandler; Added warn logs to GlobalExceptionHandler for SignalClientException --- .../component/MapperTimingAspect.java | 2 +- .../config/rest/GlobalExceptionHandler.java | 11 +++++- .../credit_tracker/enums/SignalError.java | 4 +-- .../exceptions/SignalServerException.java | 7 +++- .../credit_tracker/facade/SignalFacade.java | 34 ++++++------------- .../credit_tracker/utils/ValidationUtil.java | 32 +++++++++-------- .../utils/error/ExceptionUtils.java | 4 +-- 7 files changed, 48 insertions(+), 46 deletions(-) diff --git a/src/main/java/ru/nbch/credit_tracker/component/MapperTimingAspect.java b/src/main/java/ru/nbch/credit_tracker/component/MapperTimingAspect.java index 7802484..05902b2 100644 --- a/src/main/java/ru/nbch/credit_tracker/component/MapperTimingAspect.java +++ b/src/main/java/ru/nbch/credit_tracker/component/MapperTimingAspect.java @@ -18,7 +18,7 @@ public class MapperTimingAspect { } finally { long tookMs = (System.nanoTime() - start) / 1_000_000; String method = pjp.getSignature().toShortString(); - if (tookMs > 200) { + if (tookMs > 1000) { log.warn("Slow mapper call {} took {} ms", method, tookMs); } else { log.debug("Mapper call {} took {} ms", method, tookMs); diff --git a/src/main/java/ru/nbch/credit_tracker/config/rest/GlobalExceptionHandler.java b/src/main/java/ru/nbch/credit_tracker/config/rest/GlobalExceptionHandler.java index 4ce54fe..b0824b1 100644 --- a/src/main/java/ru/nbch/credit_tracker/config/rest/GlobalExceptionHandler.java +++ b/src/main/java/ru/nbch/credit_tracker/config/rest/GlobalExceptionHandler.java @@ -1,5 +1,6 @@ package ru.nbch.credit_tracker.config.rest; +import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; @@ -12,10 +13,12 @@ import ru.nbch.credit_tracker.entities.user_response.errors.*; import ru.nbch.credit_tracker.enums.SignalError; import ru.nbch.credit_tracker.exceptions.SignalClientException; import ru.nbch.credit_tracker.exceptions.SignalException; +import ru.nbch.credit_tracker.exceptions.SignalServerException; import ru.nbch.credit_tracker.utils.error.SimpleMessageResolver; import java.nio.charset.Charset; +@Slf4j @RestControllerAdvice public class GlobalExceptionHandler { @@ -43,14 +46,20 @@ public class GlobalExceptionHandler { public ResponseEntity handleClientException(SignalException ex) { HttpHeaders headers = new HttpHeaders(); headers.setContentType(new MediaType("application", "xml", Charset.forName(encoding))); + + String errorText = messageResolver.resolve(ex.getErrorMessage()); + CommonError commonError = getCommonError(ex); commonError.setStatus("error"); commonError.setErrorCode(ex.getErrorMessage().getSubject().getCode()); - commonError.setErrorText(messageResolver.resolve(ex.getErrorMessage())); + commonError.setErrorText(errorText); if (ex instanceof SignalClientException) { + log.warn("Response error: {}", errorText); return new ResponseEntity<>(commonError, headers, HttpStatus.BAD_REQUEST); } else { + Exception cause = ((SignalServerException) ex).getCause(); + log.error(cause.getMessage(), cause); return new ResponseEntity<>(commonError, headers, HttpStatus.INTERNAL_SERVER_ERROR); } } diff --git a/src/main/java/ru/nbch/credit_tracker/enums/SignalError.java b/src/main/java/ru/nbch/credit_tracker/enums/SignalError.java index 30f5e4c..ea68795 100644 --- a/src/main/java/ru/nbch/credit_tracker/enums/SignalError.java +++ b/src/main/java/ru/nbch/credit_tracker/enums/SignalError.java @@ -3,13 +3,13 @@ package ru.nbch.credit_tracker.enums; public enum SignalError implements IEnumKeyCode { ERROR_001("001", "Ошибка распаковки архива"), ERROR_002("002", "Отсутствует обязательный элемент: {}"), - ERROR_003("003", "Элемент ClientId не соответствует формату XXXXXXXXX"), + ERROR_003("003", "Элемент ClientId не соответствует формату XXXXXXXXX. Id: {}"), ERROR_005("005", "Неверный логин или пароль"), ERROR_006("006", "Доступ к услуге закрыт, обратитесь к курирующему менеджеру"), ERROR_007("007", "В системе уже существует пакет с таким именем"), ERROR_008("008", "PackageName не соответствует допустимому формату"), ERROR_009("009", "Превышен допустимый размер пакета"), - ERROR_010("010", "Идентификатор субъекта (Id) не соответствует допустимому формату"), + ERROR_010("010", "Идентификатор субъекта (Id) не соответствует допустимому формату: {}"), ERROR_011("011", "Получен невалидный XML"), ERROR_012("012", "Пакет {} не найден"), ERROR_013("013", "На стороне сервиса произошла ошибка, попробуйте повторить запрос позже или сообщите в техническую поддержку"), diff --git a/src/main/java/ru/nbch/credit_tracker/exceptions/SignalServerException.java b/src/main/java/ru/nbch/credit_tracker/exceptions/SignalServerException.java index 46dd713..dc1ef29 100644 --- a/src/main/java/ru/nbch/credit_tracker/exceptions/SignalServerException.java +++ b/src/main/java/ru/nbch/credit_tracker/exceptions/SignalServerException.java @@ -1,12 +1,17 @@ package ru.nbch.credit_tracker.exceptions; +import lombok.Getter; import ru.nbch.credit_tracker.enums.EnumKeyMessage; import ru.nbch.credit_tracker.enums.XmlErrorFormat; +@Getter public class SignalServerException extends SignalException { - public SignalServerException(EnumKeyMessage errorMessage, XmlErrorFormat errorFormat) { + private final Exception cause; + + public SignalServerException(EnumKeyMessage errorMessage, XmlErrorFormat errorFormat, Exception cause) { super(errorMessage, errorFormat); + this.cause = cause; } } diff --git a/src/main/java/ru/nbch/credit_tracker/facade/SignalFacade.java b/src/main/java/ru/nbch/credit_tracker/facade/SignalFacade.java index 218a1c8..ea6121d 100644 --- a/src/main/java/ru/nbch/credit_tracker/facade/SignalFacade.java +++ b/src/main/java/ru/nbch/credit_tracker/facade/SignalFacade.java @@ -109,21 +109,17 @@ public class SignalFacade { zipInputStream.getNextEntry(); filePath = writeTmpFile(zipInputStream); - if (filePath == null) { - throw serverExcp(SignalError.ERROR_013, XmlErrorFormat.MonitoringError); - } } catch (Exception e) { if (e instanceof SignalClientException) { throw (SignalClientException) e; } - log.error(e.getMessage(), e); - throw serverExcp(SignalError.ERROR_013, XmlErrorFormat.MonitoringError); + throw serverExcp(SignalError.ERROR_013, XmlErrorFormat.MonitoringError, e); } finally { if (zipInputStream != null) { try { zipInputStream.close(); } catch (IOException e) { - throw serverExcp(SignalError.ERROR_013, XmlErrorFormat.MonitoringError); + throw serverExcp(SignalError.ERROR_013, XmlErrorFormat.MonitoringError, e); } } } @@ -140,8 +136,7 @@ public class SignalFacade { if (e instanceof SignalClientException) { throw (SignalClientException) e; } - log.error(e.getMessage(), e); - throw serverExcp(SignalError.ERROR_013, XmlErrorFormat.MonitoringError); + throw serverExcp(SignalError.ERROR_013, XmlErrorFormat.MonitoringError, e); } try { @@ -165,8 +160,7 @@ public class SignalFacade { if (e instanceof SignalClientException) { throw (SignalClientException) e; } - log.error(e.getMessage(), e); - throw serverExcp(SignalError.ERROR_013, XmlErrorFormat.MonitoringError); + throw serverExcp(SignalError.ERROR_013, XmlErrorFormat.MonitoringError, e); } // в отдельном потоке запускаем регистрацию субъектов, поиск фидов и расчет флагов просрочек @@ -200,7 +194,7 @@ public class SignalFacade { return monitoringRequest; } - private String writeTmpFile(ZipInputStream zipInputStream) { + private String writeTmpFile(ZipInputStream zipInputStream) throws IOException { String folderPath = config.getLoadDir() + File.separator + "tmp_folder" + File.separator; String filePath = folderPath + UUID.randomUUID() + "monitoring_request.xml"; CTUtil.createFolder(folderPath); @@ -214,9 +208,6 @@ public class SignalFacade { } return filePath; - } catch (Exception e) { - log.error("Ошибка при записи файла запроса постановки на мониторинг на диск", e); - return null; } } @@ -281,8 +272,7 @@ public class SignalFacade { if (e instanceof SignalClientException) { throw (SignalClientException) e; } - log.error(e.getMessage(), e); - throw serverExcp(SignalError.ERROR_013, XmlErrorFormat.MonitoringActivePackagesError); + throw serverExcp(SignalError.ERROR_013, XmlErrorFormat.MonitoringActivePackagesError, e); } } @@ -318,8 +308,7 @@ public class SignalFacade { if (e instanceof SignalClientException) { throw (SignalClientException) e; } - log.error(e.getMessage(), e); - throw serverExcp(SignalError.ERROR_013, XmlErrorFormat.MonitoringActivePackagesError); + throw serverExcp(SignalError.ERROR_013, XmlErrorFormat.MonitoringActivePackagesError, e); } } @@ -344,8 +333,7 @@ public class SignalFacade { if (e instanceof SignalClientException) { throw (SignalClientException) e; } - log.error(e.getMessage(), e); - throw serverExcp(SignalError.ERROR_017, XmlErrorFormat.MonitoringPackageDeleteError); + throw serverExcp(SignalError.ERROR_017, XmlErrorFormat.MonitoringPackageDeleteError, e); } } @@ -391,8 +379,7 @@ public class SignalFacade { if (e instanceof SignalClientException) { throw (SignalClientException) e; } - log.error(e.getMessage(), e); - throw serverExcp(SignalError.ERROR_013, XmlErrorFormat.MonitoringReportListError); + throw serverExcp(SignalError.ERROR_013, XmlErrorFormat.MonitoringReportListError, e); } } @@ -418,8 +405,7 @@ public class SignalFacade { if (e instanceof SignalClientException) { throw (SignalClientException) e; } - log.error(e.getMessage(), e); - throw serverExcp(SignalError.ERROR_013, XmlErrorFormat.MonitoringDownloadError); + throw serverExcp(SignalError.ERROR_013, XmlErrorFormat.MonitoringDownloadError, e); } } } diff --git a/src/main/java/ru/nbch/credit_tracker/utils/ValidationUtil.java b/src/main/java/ru/nbch/credit_tracker/utils/ValidationUtil.java index d0068b2..4885a27 100644 --- a/src/main/java/ru/nbch/credit_tracker/utils/ValidationUtil.java +++ b/src/main/java/ru/nbch/credit_tracker/utils/ValidationUtil.java @@ -1,5 +1,6 @@ package ru.nbch.credit_tracker.utils; +import lombok.extern.slf4j.Slf4j; import ru.nbch.credit_tracker.entities.user_request.monitoring_request.MonitoringRequest; import ru.nbch.credit_tracker.entities.user_request.monitoring_request.Subject; import ru.nbch.credit_tracker.enums.SignalError; @@ -10,25 +11,30 @@ import java.util.regex.Pattern; import static ru.nbch.credit_tracker.utils.error.ExceptionUtils.clientExcp; +@Slf4j public class ValidationUtil { - private static String phoneRegex = "^\\d{9}$"; - private static String packageNameRegex = "^[A-Z0-9_]{1,22}$"; - private static String npIdRegex = "^\\S{1,36}$"; + private static final String phoneRegex = "^\\d{9}$"; + private static final String packageNameRegex = "^[A-Z0-9_]{1,22}$"; + private static final String npIdRegex = "^\\S{1,36}$"; public static void validateMonitoringRequest(MonitoringRequest request) throws SignalClientException { if (request == null) { throw clientExcp(SignalError.ERROR_011, XmlErrorFormat.MonitoringError); } - if (request.getUserId() == null) { - throw clientExcp(SignalError.ERROR_002, XmlErrorFormat.MonitoringError, "UserId"); - } - if (request.getPackageName() == null) { throw clientExcp(SignalError.ERROR_002, XmlErrorFormat.MonitoringError, "PackageName"); } + if (!validatePackageName(request.getPackageName())) { + throw clientExcp(SignalError.ERROR_008, XmlErrorFormat.MonitoringError); + } + + if (request.getUserId() == null) { + throw clientExcp(SignalError.ERROR_002, XmlErrorFormat.MonitoringError, "UserId"); + } + if (request.getPassword() == null) { throw clientExcp(SignalError.ERROR_002, XmlErrorFormat.MonitoringError, "Password"); } @@ -41,16 +47,12 @@ public class ValidationUtil { throw clientExcp(SignalError.ERROR_002, XmlErrorFormat.MonitoringError, "Subject"); } - if (!validatePackageName(request.getPackageName())) { - throw clientExcp(SignalError.ERROR_008, XmlErrorFormat.MonitoringError); - } - for (Subject subject : request.getSubjects().getSubject()) { - if (!validatePhone(subject.getClientId())) { - throw clientExcp(SignalError.ERROR_003, XmlErrorFormat.MonitoringError); - } if (!validateNPId(subject.getId())) { - throw clientExcp(SignalError.ERROR_010, XmlErrorFormat.MonitoringError); + throw clientExcp(SignalError.ERROR_010, XmlErrorFormat.MonitoringError, subject.getId()); + } + if (!validatePhone(subject.getClientId())) { + throw clientExcp(SignalError.ERROR_003, XmlErrorFormat.MonitoringError, subject.getId()); } } } diff --git a/src/main/java/ru/nbch/credit_tracker/utils/error/ExceptionUtils.java b/src/main/java/ru/nbch/credit_tracker/utils/error/ExceptionUtils.java index a15457c..2e94e78 100644 --- a/src/main/java/ru/nbch/credit_tracker/utils/error/ExceptionUtils.java +++ b/src/main/java/ru/nbch/credit_tracker/utils/error/ExceptionUtils.java @@ -12,7 +12,7 @@ public class ExceptionUtils { return new SignalClientException(new EnumKeyMessage(enumKeyCode, args), xmlErrorFormat); } - public static SignalServerException serverExcp(IEnumKeyCode enumKeyCode, XmlErrorFormat xmlErrorFormat, Object... args) { - return new SignalServerException(new EnumKeyMessage(enumKeyCode, args), xmlErrorFormat); + public static SignalServerException serverExcp(IEnumKeyCode enumKeyCode, XmlErrorFormat xmlErrorFormat, Exception cause, Object... args) { + return new SignalServerException(new EnumKeyMessage(enumKeyCode, args), xmlErrorFormat, cause); } }