Spring ConstraintValidator устанавливает пользовательский код / ​​отклоненное значение - PullRequest
0 голосов
/ 07 января 2019

Я создал собственный ConstraintValidator уровня класса, который проверяет определенное поле, если другое поле имеет определенное значение. Вот объект:

@ValidRequest
public class Request {

  interface ValidationName {}

  @NotBlank(groups = {Default.class})
  private final String fieldName;

  @NotBlank(groups = {ValidationName.class})
  @Length(max = 40, groups = {ValidationName.class})
  private final String fieldValue;

  // Constructor, getters
}

И ConstraintValidator на уровне класса:

public class ValidRequestImpl implements
  ConstraintValidator<ValidRequest, Request> {

  private Validator validator;

  @Autowired
  public ValidRequestImpl (Validator validator) {
    this.validator = validator;
  }

  @Override
  public void initialize(ValidRequest constraintAnnotation) {}

  @Override
  public boolean isValid(ValidRequest value, ConstraintValidatorContext context) {
    if (!validator.validateProperty(value, "fieldName").isEmpty()) {
      return true;
    }
    if (value.getFieldName().equals("name")) {
      Set<ConstraintViolation<Request>> violations =
        validator.validateProperty(value, "fieldValue", ValidationName.class);
      violations.forEach(violation -> context
        .buildConstraintViolationWithTemplate(violation.getMessage())
        .addPropertyNode("fieldValue")
        .addConstraintViolation());
      context.disableDefaultConstraintViolation();
      return violations.isEmpty();
    }
    return true;
  }
}

Это работает нормально, но возвращенный объект ошибок не очень полезен:

"errors": [
  {
    "message": "Please enter a name.",
    "field_name": "request.fieldValue",
    "rejected_value": "com.example.Request@5f017a8c",
    "code": "ValidRequest"
  }
],

В идеале, я бы хотел, чтобы поле rejected_value было фактическим значением fieldValue, которое было передано (в данном случае пустой строкой), а не объектом уровня класса. Я также хотел бы, чтобы поле code было фактической аннотацией, которая не удалась (NotBlank), а не ValidRequest. context.buildConstraintViolationWithTemplate () не имеет каких-либо методов, позволяющих изменить эти поля.

Как мне это сделать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...