Генерация кода ошибки на свойство в В спящем режиме Блок проверки допустимости

Я смотрю на использование, в спящем режиме Блок проверки допустимости для моего требования. Я хочу проверить 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;
}

Что-то как вышеупомянутое было бы хорошо, но оно не должно быть структурировано точно как этот. Я не вижу способ сделать, это с В спящем режиме Блок проверки допустимости. Действительно ли это возможно?

8
задан Peter Mortensen 4 May 2010 в 16:55
поделиться

3 ответа

Из раздела 4.2. ConstraintViolation спецификации:

Метод getMessageTemplate возвращает неинтерполированное сообщение об ошибке (обычно это атрибут message в объявлении ограничения). Платформы могут использовать это как ключ кода ошибки.

Думаю, это ваш лучший вариант.

1
ответ дан 5 December 2019 в 22:17
поделиться

Что бы я попытался сделать, так это изолировать это поведение на уровне 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.

Надеюсь, это помогло.

0
ответ дан 5 December 2019 в 22:17
поделиться

Вы можете создать пользовательскую аннотацию для получения нужного вам поведения, а затем при проверке и использовании рефлексии вы можете извлечь значение аннотации. Что-то вроде следующего:

@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());
}

Сказав это, я, вероятно, поставил бы под сомнение требования к кодам ошибок для этих типов сообщений.

5
ответ дан 5 December 2019 в 22:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: