在Hibernate Validator中为每个属性生成错误代码

时间:2010-04-18 21:02:05

标签: java validation hibernate-validator

我正在考虑使用Hibernate Validator来满足我的要求。我想验证一个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;
}

像上面这样的东西会很好,但它不一定要像那样结构。我看不到用Hibernate Validator做这个的方法。有可能吗?

3 个答案:

答案 0 :(得分:5)

您可以创建自定义注释以获取您要查找的行为,然后在验证和使用反馈时,您可以提取注释的值。如下所示:

@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ErrorCode {
    String value();
}

在你的bean中:

@NotNull
@Length( min = 5, max = 10 )
@ErrorCode("1234")
public String myProperty;

验证你的bean:

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

话虽如此,我可能会质疑是否需要为这些类型的消息提供错误代码。

答案 1 :(得分:1)

来自规范的4.2. ConstraintViolation部分:

  

getMessageTemplate方法返回非插值错误消息(通常是约束声明中的message属性)。框架可以将其用作错误代码密钥。

我认为这是你最好的选择。

答案 2 :(得分:0)

我尝试做的是在应用程序的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方法上执行此操作。

我希望这会有所帮助。