Moved SignalServerException logs to GlobalExceptionHandler; Added warn logs to GlobalExceptionHandler for SignalClientException

This commit is contained in:
Mikhail Trofimov 2025-09-23 14:20:57 +03:00
parent d136c30739
commit 21bd541243
6 changed files with 47 additions and 45 deletions

View file

@ -1,5 +1,6 @@
package ru.nbch.credit_tracker.config.rest; package ru.nbch.credit_tracker.config.rest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpHeaders; import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType; 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.enums.SignalError;
import ru.nbch.credit_tracker.exceptions.SignalClientException; import ru.nbch.credit_tracker.exceptions.SignalClientException;
import ru.nbch.credit_tracker.exceptions.SignalException; import ru.nbch.credit_tracker.exceptions.SignalException;
import ru.nbch.credit_tracker.exceptions.SignalServerException;
import ru.nbch.credit_tracker.utils.error.SimpleMessageResolver; import ru.nbch.credit_tracker.utils.error.SimpleMessageResolver;
import java.nio.charset.Charset; import java.nio.charset.Charset;
@Slf4j
@RestControllerAdvice @RestControllerAdvice
public class GlobalExceptionHandler { public class GlobalExceptionHandler {
@ -43,14 +46,20 @@ public class GlobalExceptionHandler {
public ResponseEntity<CommonError> handleClientException(SignalException ex) { public ResponseEntity<CommonError> handleClientException(SignalException ex) {
HttpHeaders headers = new HttpHeaders(); HttpHeaders headers = new HttpHeaders();
headers.setContentType(new MediaType("application", "xml", Charset.forName(encoding))); headers.setContentType(new MediaType("application", "xml", Charset.forName(encoding)));
String errorText = messageResolver.resolve(ex.getErrorMessage());
CommonError commonError = getCommonError(ex); CommonError commonError = getCommonError(ex);
commonError.setStatus("error"); commonError.setStatus("error");
commonError.setErrorCode(ex.getErrorMessage().getSubject().getCode()); commonError.setErrorCode(ex.getErrorMessage().getSubject().getCode());
commonError.setErrorText(messageResolver.resolve(ex.getErrorMessage())); commonError.setErrorText(errorText);
if (ex instanceof SignalClientException) { if (ex instanceof SignalClientException) {
log.warn(errorText);
return new ResponseEntity<>(commonError, headers, HttpStatus.BAD_REQUEST); return new ResponseEntity<>(commonError, headers, HttpStatus.BAD_REQUEST);
} else { } else {
Exception cause = ((SignalServerException) ex).getCause();
log.error(cause.getMessage(), cause);
return new ResponseEntity<>(commonError, headers, HttpStatus.INTERNAL_SERVER_ERROR); return new ResponseEntity<>(commonError, headers, HttpStatus.INTERNAL_SERVER_ERROR);
} }
} }

View file

@ -3,13 +3,13 @@ package ru.nbch.credit_tracker.enums;
public enum SignalError implements IEnumKeyCode { public enum SignalError implements IEnumKeyCode {
ERROR_001("001", "Ошибка распаковки архива"), ERROR_001("001", "Ошибка распаковки архива"),
ERROR_002("002", "Отсутствует обязательный элемент: {}"), ERROR_002("002", "Отсутствует обязательный элемент: {}"),
ERROR_003("003", "Элемент ClientId не соответствует формату XXXXXXXXX"), ERROR_003("003", "Элемент ClientId не соответствует формату XXXXXXXXX. Id: {}"),
ERROR_005("005", "Неверный логин или пароль"), ERROR_005("005", "Неверный логин или пароль"),
ERROR_006("006", "Доступ к услуге закрыт, обратитесь к курирующему менеджеру"), ERROR_006("006", "Доступ к услуге закрыт, обратитесь к курирующему менеджеру"),
ERROR_007("007", "В системе уже существует пакет с таким именем"), ERROR_007("007", "В системе уже существует пакет с таким именем"),
ERROR_008("008", "PackageName не соответствует допустимому формату"), ERROR_008("008", "PackageName не соответствует допустимому формату"),
ERROR_009("009", "Превышен допустимый размер пакета"), ERROR_009("009", "Превышен допустимый размер пакета"),
ERROR_010("010", "Идентификатор субъекта (Id) не соответствует допустимому формату"), ERROR_010("010", "Идентификатор субъекта (Id) не соответствует допустимому формату: {}"),
ERROR_011("011", "Получен невалидный XML"), ERROR_011("011", "Получен невалидный XML"),
ERROR_012("012", "Пакет {} не найден"), ERROR_012("012", "Пакет {} не найден"),
ERROR_013("013", "На стороне сервиса произошла ошибка, попробуйте повторить запрос позже или сообщите в техническую поддержку"), ERROR_013("013", "На стороне сервиса произошла ошибка, попробуйте повторить запрос позже или сообщите в техническую поддержку"),

View file

@ -1,12 +1,17 @@
package ru.nbch.credit_tracker.exceptions; package ru.nbch.credit_tracker.exceptions;
import lombok.Getter;
import ru.nbch.credit_tracker.enums.EnumKeyMessage; import ru.nbch.credit_tracker.enums.EnumKeyMessage;
import ru.nbch.credit_tracker.enums.XmlErrorFormat; import ru.nbch.credit_tracker.enums.XmlErrorFormat;
@Getter
public class SignalServerException extends SignalException { 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); super(errorMessage, errorFormat);
this.cause = cause;
} }
} }

View file

@ -109,21 +109,17 @@ public class SignalFacade {
zipInputStream.getNextEntry(); zipInputStream.getNextEntry();
filePath = writeTmpFile(zipInputStream); filePath = writeTmpFile(zipInputStream);
if (filePath == null) {
throw serverExcp(SignalError.ERROR_013, XmlErrorFormat.MonitoringError);
}
} catch (Exception e) { } catch (Exception e) {
if (e instanceof SignalClientException) { if (e instanceof SignalClientException) {
throw (SignalClientException) e; throw (SignalClientException) e;
} }
log.error(e.getMessage(), e); throw serverExcp(SignalError.ERROR_013, XmlErrorFormat.MonitoringError, e);
throw serverExcp(SignalError.ERROR_013, XmlErrorFormat.MonitoringError);
} finally { } finally {
if (zipInputStream != null) { if (zipInputStream != null) {
try { try {
zipInputStream.close(); zipInputStream.close();
} catch (IOException e) { } 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) { if (e instanceof SignalClientException) {
throw (SignalClientException) e; throw (SignalClientException) e;
} }
log.error(e.getMessage(), e); throw serverExcp(SignalError.ERROR_013, XmlErrorFormat.MonitoringError, e);
throw serverExcp(SignalError.ERROR_013, XmlErrorFormat.MonitoringError);
} }
try { try {
@ -165,8 +160,7 @@ public class SignalFacade {
if (e instanceof SignalClientException) { if (e instanceof SignalClientException) {
throw (SignalClientException) e; throw (SignalClientException) e;
} }
log.error(e.getMessage(), e); throw serverExcp(SignalError.ERROR_013, XmlErrorFormat.MonitoringError, e);
throw serverExcp(SignalError.ERROR_013, XmlErrorFormat.MonitoringError);
} }
// в отдельном потоке запускаем регистрацию субъектов, поиск фидов и расчет флагов просрочек // в отдельном потоке запускаем регистрацию субъектов, поиск фидов и расчет флагов просрочек
@ -200,7 +194,7 @@ public class SignalFacade {
return monitoringRequest; 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 folderPath = config.getLoadDir() + File.separator + "tmp_folder" + File.separator;
String filePath = folderPath + UUID.randomUUID() + "monitoring_request.xml"; String filePath = folderPath + UUID.randomUUID() + "monitoring_request.xml";
CTUtil.createFolder(folderPath); CTUtil.createFolder(folderPath);
@ -214,9 +208,6 @@ public class SignalFacade {
} }
return filePath; return filePath;
} catch (Exception e) {
log.error("Ошибка при записи файла запроса постановки на мониторинг на диск", e);
return null;
} }
} }
@ -281,8 +272,7 @@ public class SignalFacade {
if (e instanceof SignalClientException) { if (e instanceof SignalClientException) {
throw (SignalClientException) e; throw (SignalClientException) e;
} }
log.error(e.getMessage(), e); throw serverExcp(SignalError.ERROR_013, XmlErrorFormat.MonitoringActivePackagesError, e);
throw serverExcp(SignalError.ERROR_013, XmlErrorFormat.MonitoringActivePackagesError);
} }
} }
@ -318,8 +308,7 @@ public class SignalFacade {
if (e instanceof SignalClientException) { if (e instanceof SignalClientException) {
throw (SignalClientException) e; throw (SignalClientException) e;
} }
log.error(e.getMessage(), e); throw serverExcp(SignalError.ERROR_013, XmlErrorFormat.MonitoringActivePackagesError, e);
throw serverExcp(SignalError.ERROR_013, XmlErrorFormat.MonitoringActivePackagesError);
} }
} }
@ -344,8 +333,7 @@ public class SignalFacade {
if (e instanceof SignalClientException) { if (e instanceof SignalClientException) {
throw (SignalClientException) e; throw (SignalClientException) e;
} }
log.error(e.getMessage(), e); throw serverExcp(SignalError.ERROR_017, XmlErrorFormat.MonitoringPackageDeleteError, e);
throw serverExcp(SignalError.ERROR_017, XmlErrorFormat.MonitoringPackageDeleteError);
} }
} }
@ -391,8 +379,7 @@ public class SignalFacade {
if (e instanceof SignalClientException) { if (e instanceof SignalClientException) {
throw (SignalClientException) e; throw (SignalClientException) e;
} }
log.error(e.getMessage(), e); throw serverExcp(SignalError.ERROR_013, XmlErrorFormat.MonitoringReportListError, e);
throw serverExcp(SignalError.ERROR_013, XmlErrorFormat.MonitoringReportListError);
} }
} }
@ -418,8 +405,7 @@ public class SignalFacade {
if (e instanceof SignalClientException) { if (e instanceof SignalClientException) {
throw (SignalClientException) e; throw (SignalClientException) e;
} }
log.error(e.getMessage(), e); throw serverExcp(SignalError.ERROR_013, XmlErrorFormat.MonitoringDownloadError, e);
throw serverExcp(SignalError.ERROR_013, XmlErrorFormat.MonitoringDownloadError);
} }
} }
} }

View file

@ -1,5 +1,6 @@
package ru.nbch.credit_tracker.utils; 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.MonitoringRequest;
import ru.nbch.credit_tracker.entities.user_request.monitoring_request.Subject; import ru.nbch.credit_tracker.entities.user_request.monitoring_request.Subject;
import ru.nbch.credit_tracker.enums.SignalError; 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; import static ru.nbch.credit_tracker.utils.error.ExceptionUtils.clientExcp;
@Slf4j
public class ValidationUtil { public class ValidationUtil {
private static String phoneRegex = "^\\d{9}$"; private static final String phoneRegex = "^\\d{9}$";
private static String packageNameRegex = "^[A-Z0-9_]{1,22}$"; private static final String packageNameRegex = "^[A-Z0-9_]{1,22}$";
private static String npIdRegex = "^\\S{1,36}$"; private static final String npIdRegex = "^\\S{1,36}$";
public static void validateMonitoringRequest(MonitoringRequest request) throws SignalClientException { public static void validateMonitoringRequest(MonitoringRequest request) throws SignalClientException {
if (request == null) { if (request == null) {
throw clientExcp(SignalError.ERROR_011, XmlErrorFormat.MonitoringError); throw clientExcp(SignalError.ERROR_011, XmlErrorFormat.MonitoringError);
} }
if (request.getUserId() == null) {
throw clientExcp(SignalError.ERROR_002, XmlErrorFormat.MonitoringError, "UserId");
}
if (request.getPackageName() == null) { if (request.getPackageName() == null) {
throw clientExcp(SignalError.ERROR_002, XmlErrorFormat.MonitoringError, "PackageName"); 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) { if (request.getPassword() == null) {
throw clientExcp(SignalError.ERROR_002, XmlErrorFormat.MonitoringError, "Password"); throw clientExcp(SignalError.ERROR_002, XmlErrorFormat.MonitoringError, "Password");
} }
@ -41,16 +47,12 @@ public class ValidationUtil {
throw clientExcp(SignalError.ERROR_002, XmlErrorFormat.MonitoringError, "Subject"); 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()) { for (Subject subject : request.getSubjects().getSubject()) {
if (!validatePhone(subject.getClientId())) {
throw clientExcp(SignalError.ERROR_003, XmlErrorFormat.MonitoringError);
}
if (!validateNPId(subject.getId())) { 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());
} }
} }
} }

View file

@ -12,7 +12,7 @@ public class ExceptionUtils {
return new SignalClientException(new EnumKeyMessage(enumKeyCode, args), xmlErrorFormat); return new SignalClientException(new EnumKeyMessage(enumKeyCode, args), xmlErrorFormat);
} }
public static SignalServerException serverExcp(IEnumKeyCode enumKeyCode, XmlErrorFormat xmlErrorFormat, Object... args) { public static SignalServerException serverExcp(IEnumKeyCode enumKeyCode, XmlErrorFormat xmlErrorFormat, Exception cause, Object... args) {
return new SignalServerException(new EnumKeyMessage(enumKeyCode, args), xmlErrorFormat); return new SignalServerException(new EnumKeyMessage(enumKeyCode, args), xmlErrorFormat, cause);
} }
} }