Я создал собственный 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 () не имеет каких-либо методов, позволяющих изменить эти поля.
Как мне это сделать?