Как обрабатывать пользовательскую аннотацию при добавлении @valid в класс обслуживания

Я использую пользовательскую проверку в классе сущностей, аннотацию @Valid в классе обслуживания не в классе контроллера и пользовательский контроллер исключений (@ControllerAdvice) в Spring Boot.

Когда я использую @Valid в контроллере, пользовательская аннотация выдает MethodArgumentNotValidException, и я могу с этим справиться.

Проблема возникает, когда я использую @Valid в классе обслуживания, пользовательская аннотация перестала вызывать исключение. Я хочу обрабатывать пользовательскую аннотацию в ConstraintViolationException. Я использую пользовательскую аннотацию на уровне объекта, а не на уровне поля. Пожалуйста помоги


comment
проверьте здесь: Spring @Validated на сервисном уровне   -  person sudipn    schedule 17.12.2019
comment
также DZone Проверка метода с помощью Spring 3.1 и Hibernate Validator 4.2   -  person sudipn    schedule 17.12.2019


Ответы (1)


Я получил решение выглядит следующим образом:

@ExceptionHandler(ConstraintViolationException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ResponseBody
ValidationErrorReponse onConstraintValidationException(ConstraintViolationException e) {
    ValidationErrorReponse error = new ValidationErrorReponse();
    Map<String, List<String>> errorMap = new HashMap<>();
    List<Violation> violations = new ArrayList<>();
    for (ConstraintViolation<?> violation : e.getConstraintViolations()) {
        if (!errorMap.containsKey(violation.getPropertyPath().toString())) {
              List<String> errorMessages = new ArrayList<>();
            if(!violation.getMessage().isEmpty()) {
                errorMessages.add(violation.getMessage());
                errorMap.put(violation.getPropertyPath().toString(), errorMessages);                    
            }else {
                ConstraintDescriptor<?> objEceptions = violation.getConstraintDescriptor();
                errorMessages.add((String)objEceptions.getAttributes().get("errormessage"));
                String errorField = (String)objEceptions.getAttributes().get("errorField");
                errorMap.put(violation.getPropertyPath().toString().concat("."+errorField), errorMessages);  
            }
        } else {
            errorMap.get(violation.getPropertyPath().toString()).add(violation.getMessage());
        }
    }
    for (Entry<String, List<String>> entry : errorMap.entrySet()) {
        Violation violation = new Violation(entry.getKey(), entry.getValue());
        violations.add(violation);
    }
    error.setViolations(violations);
    return error;
}

}

person alok    schedule 18.12.2019