Как регистрировать ошибки проверки в загрузочном приложении Spring - PullRequest
0 голосов
/ 16 октября 2018

Я использую SpringBoot (spring-boot-starter-web 1.5.16.RELEASE) и hibernate-validator 6.0.11.Final в своем REST-сервисе.

Объекты DTO, снабженные соответствующими ограничениями проверки (ОБНОВЛЕНИЕ: я использую аннотацию @Valid для параметра контроллера), и проверка работает как ожидалось.

Я хотел бы, чтобы все ошибки проверки (которые были отправлены клиентам) были зарегистрированы в файлах журнала.

Я предполагаю, что должен быть какой-то простой способ включить такого рода сообщения (например, флаг в свойствах приложения), но я нигде не могу его найти.

Любые предложения приветствуются.

Ответы [ 3 ]

0 голосов
/ 16 октября 2018

Вы должны определить обработчик Global Exception, используя @ControllerAdvice для перехвата всех ошибок, связанных с JSR 303.Даже здесь вы определяете обработчики исключений для своего собственного бизнес-исключения и регистрируете их по мере необходимости.

 @ControllerAdvice
    class ApiException{
     @ExceptionHandler(MethodArgumentNotValidException.class)
        @ResponseStatus(HttpStatus.BAD_REQUEST)
        @ResponseBody
        public ValidationErrorDTO processValidationError(MethodArgumentNotValidException ex) {
            BindingResult result = ex.getBindingResult();
            List<FieldError> fieldErrors = result.getFieldErrors();

          //log errors here

            return processFieldErrors(fieldErrors);
        }

      private ValidationErrorDTO processFieldErrors(List<FieldError> fieldErrors) {
            ValidationErrorDTO dto = new ValidationErrorDTO();

            for (FieldError fieldError: fieldErrors) {
                String localizedErrorMessage = resolveLocalizedErrorMessage(fieldError);
                dto.addFieldError(fieldError.getField(), localizedErrorMessage);
            }

            return dto;
        }

    }

    public class ValidationErrorDTO {

        private List<FieldErrorDTO> fieldErrors = new ArrayList<>();

        public ValidationErrorDTO() {

        }

        public void addFieldError(String path, String message) {
            FieldErrorDTO error = new FieldErrorDTO(path, message);
            fieldErrors.add(error);
        }

    }
0 голосов
/ 18 октября 2018

Оказалось, что org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver регистрирует ошибки проверки по умолчанию (и это именно то, что мне нужно), например,

2018-10-18 12:54:25.552  WARN 22760 --- [nio-8092-exec-2] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.bind.MethodArgumentNotValidException: Validation failed for 

Причина, почемуЯ не видел, чтобы эти сообщения были в фильтрах инструментов агрегации журналов (то есть я не видел сообщений в Kibana, но они появляются на локальном компьютере).

Для тех, кто не видит сообщения локально - проверьте конфигурацию журналирования иубедитесь, что журналы Spring не отключены.

0 голосов
/ 16 октября 2018

Обновление: в этом случае вы можете использовать BindingResult объект, определенный после @Valid объявления бина в методе контроллера, например

@RequestMapping(value = "/foo")
public String foo(@Valid POJO object, BindingResult result) {
   List<FieldError> errors = result.getFieldErrors();
   for (FieldError error : errors ) {
     log.error(error.getDefaultMessage());
   } 
}

ИЛИ вам лучше использовать @ExceptionHandler для типа исключения MethodArgumentNotValidException


старый ответ: Если вы проверяете бины, такие как

Set<ConstraintViolation<POJO>> violations = validator.validate(pojo);

, то вы можете перебирать нарушения и регистрировать их, как

for (ConstraintViolation<POJO> violation : violations) {
   log.error(violation.getMessage()); 
}

Скопировано из: https://www.baeldung.com/javax-validation

...