Я смотрю на использование, в спящем режиме Блок проверки допустимости для моего требования. Я хочу проверить JavaBean, где свойства могут иметь несколько проверок проверки. Например:
class MyValidationBean
{
@NotNull
@Length( min = 5, max = 10 )
private String myProperty;
}
Но если это свойство приводит проверку к сбою, я хочу, чтобы определенный код ошибки был связан с ConstraintViolation, независимо от того, перестало ли это работать из-за @Required или @Length, хотя я хотел бы сохранить сообщение об ошибке.
class MyValidationBean
{
@NotNull
@Length( min = 5, max = 10 )
@ErrorCode( "1234" )
private String myProperty;
}
Что-то как вышеупомянутое было бы хорошо, но оно не должно быть структурировано точно как этот. Я не вижу способ сделать, это с В спящем режиме Блок проверки допустимости. Действительно ли это возможно?
Из раздела 4.2. ConstraintViolation спецификации:
Метод
getMessageTemplate
возвращает неинтерполированное сообщение об ошибке (обычно это атрибутmessage
в объявлении ограничения). Платформы могут использовать это как ключ кода ошибки.
Думаю, это ваш лучший вариант.
Что бы я попытался сделать, так это изолировать это поведение на уровне DAO приложения.
Используя ваш пример, мы будем иметь:
public class MyValidationBeanDAO {
public void persist(MyValidationBean element) throws DAOException{
Set<ConstraintViolation> constraintViolations = validator.validate(element);
if(!constraintViolations.isEmpty()){
throw new DAOException("1234", contraintViolations);
}
// it's ok, just persist it
session.saveOrUpdate(element);
}
}
И следующий класс исключений:
public class DAOException extends Exception {
private final String errorCode;
private final Set<ConstraintViolation> constraintViolations;
public DAOException(String errorCode, Set<ConstraintViolation> constraintViolations){
super(String.format("Errorcode %s", errorCode));
this.errorCode = errorCode;
this.constraintViolations = constraintViolations;
}
// getters for properties here
}
Вы могли бы добавить некоторую аннотационную информацию, основанную на том, какое свойство не подтвердилось отсюда, но всегда делая это на методе DAO.
Надеюсь, это помогло.
Вы можете создать пользовательскую аннотацию для получения нужного вам поведения, а затем при проверке и использовании рефлексии вы можете извлечь значение аннотации. Что-то вроде следующего:
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ErrorCode {
String value();
}
В вашем бобовом:
@NotNull
@Length( min = 5, max = 10 )
@ErrorCode("1234")
public String myProperty;
При проверке вашего бобового:
Set<ConstraintViolation<MyValidationBean>> constraintViolations = validator.validate(myValidationBean);
for (ConstraintViolation<MyValidationBean>cv: constraintViolations) {
ErrorCode errorCode = cv.getRootBeanClass().getField(cv.getPropertyPath().toString()).getAnnotation(ErrorCode.class);
System.out.println("ErrorCode:" + errorCode.value());
}
Сказав это, я, вероятно, поставил бы под сомнение требования к кодам ошибок для этих типов сообщений.