Как избавиться от propertyPath в атрибуте title Ответ об ошибке ConstraintValidatorContext - настраиваемая проверка SpringBoot - PullRequest
0 голосов
/ 20 июня 2020

Я реализовал настраиваемую аннотацию проверки для запроса в Spring Rest Controller, которая проверяет, доступно ли field2 в теле запроса ввода, тогда field1 не должно быть пустым. Мой вопрос: как мне избавиться от поля UserInputDTO.userInputDTO в моем ответе на ошибку (перед передачей его в ExceptionHandler)?

Примечание: Мне это нужно, потому что я не хочу раскрывать конфиденциальные данные ( Имя класса и Имя экземпляра ) в ответе на ошибку. Я отладил это и попытался, но не смог удалить путь по умолчанию или базовый путь (из PathImpl ) из объекта ConstraintValidatorContextImpl .

Ответ на ошибку

{
status : 400
title : Bad Request: Field 'UserInputDTO.userInputDTO' : field1 should not be empty if Field2 is present
}

Класс аннотации

@Documented
@Constraint(validatedBy = UserInputValidator.class)
@Target( { ElementType.METHOD, ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
public @interface UserInputConstraint {
    String message() default "Invalid request";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};

Класс валидатора

public class UserInputValidator implements
  ConstraintValidator<UserInputConstraint, UserInputDTO> {

    @Override
    public void initialize(UserInputConstraint userInputConstraint) {
    }

    @Override
    public boolean isValid(UserInputDTO userInputDTO,
      ConstraintValidatorContext cxt) {
        boolean isValid=true;
        String errorMessage = null;
        if (userInputDTO.field2 != null && userInputDTO.field1 == null) {
               isValid = false;
              context.buildConstraintViolationWithTemplate("field1 should not be empty if Field2 is presen").addConstraintViolation();
    }
       return isValid;
}

1 Ответ

0 голосов
/ 20 июня 2020

Вы можете @Override handleMethodArgumentNotValid и настроить тело ответа об ошибке.

Пример:

@RestControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {

  @Override
  public ResponseEntity<Object> handleMethodArgumentNotValid(
      MethodArgumentNotValidException exception, HttpHeaders headers, HttpStatus status,
      WebRequest request) {   
    List<Object> errors = new ArrayList<Object>();
    for (FieldError fielderror : exception.getBindingResult().getFieldErrors()) {
      Map<String, Object> error = new HashMap<>();
      error.put("code", fielderror.getCode());
      error.put("message", fielderror.getDefaultMessage());
      errors.add(error);
    }
    return new ResponseEntity<>(errors, apiError.getStatus());
  }
} 

И отключить DefaultConstraintViolation в валидаторе аннотаций

context.disableDefaultConstraintViolation();
...