2013-07-03 80 views
2

我有一个包含验证注释的bean。我要触发验证使用下面的代码手动:来自程序的Bean验证消息

Validator validator = Validation.buildDefaultValidatorFactory().getValidator(); 
Set<ConstraintViolation<Object>> constraintViolations = validator.validate(object, validationGroup); 

我的问题是,1)你怎么验证失败和2场)如何获得相关信息?

我不想使用.properties文件。没有前端显示。但它的服务,我需要发送失败的验证消息和验证失败的字段的响应。

回答

4

如何获得验证失败的字段?

未通过验证的字段将返回MethodConstraintViolationException。您通过调用getConstraintViolations()来检索个别违规,然后可以通过getPropertyPath()检索该字段并在节点上行走。例如,如果您返回的是蛇案例响应(例如user_name),但是您的bean属性名称(例如,是username,你必须得到更多的创意。

在这种情况下,您可以将该字段的名称作为Payload存储在bean验证注释中。

响应现场:

@JsonProperty("user_name") 
@NotEmpty(message = ErrorMessageKeys.USERNAME_REQUIRED, 
      payload = {FieldNamePayload.UserName.class}) 
private String username; 

有效载荷等级:

public class FieldNamePayload 
{ 
    /** 
    * Represents the field name "user_name" 
    */ 
    public static class UserName implements ValuePayload 
    { 
     private static final String value = "user_name"; 

     @Override 
     public String getValue() 
     { 
      return value; 
     } 
    } 
} 

检索您的异常映射器的有效载荷:

List<MethodConstraintViolation<?>> violations = new ArrayList<MethodConstraintViolation<?>>(exception.getConstraintViolations()); 

    for(MethodConstraintViolation<?> violation : violations) 
    { 
     String field = getFieldName(violation); 
     String message = violation.getMessage(); 

     for(Class<? extends Payload> payload : new ArrayList<Class<? extends Payload>>(violation.getConstraintDescriptor().getPayload())) 
     { 
      //Retrieve field name from constraint payload 
      if(payload.isAssignableFrom(FieldNamePayload.UserName.class)) 
      { 
       field = getPayloadValue(payload); 
      } 
     } 

     //Create an error response here! 
    } 

如何获取相关消息?

默认情况下,Bean验证框架查找在本地化文件中的消息在与以下命名约定的classpath的根目录:

  • ValidationMessages.properties默认语言环境。
  • ValidationMessages_{locale}.properties时,需要本地化

如果要覆盖此行为,改变被检索的验证消息,其中来自你可以使用Hibernate的验证供应商和实施定制ResourceBundleLocator,你会添加到ResourceBundleMessageInterpolator

ValidatorFactory validatorFactory = Validation 
    .byProvider(HibernateValidator.class) 
    .configure() 
    .messageInterpolator(
     new ResourceBundleMessageInterpolator(
      new MyCustomResourceBundleLocator())) 
    .buildValidatorFactory(); 
+0

如果我不想覆盖这些消息,而我只想获取默认验证消息? –

+1

默认消息位于MessageConstraintViolation对象上。调用getMessage()方法。看看上面的例外映射代码。 – gregwhitaker

+0

非常感谢您的澄清! –

1

关于1,你是什么意思与领域? java.lang.reflect.Field?您无法直接访问它。你可以做的是调用ConstraintViolation#getPropertyPath来获取属性路径。您需要迭代节点,并在叶节点处调用getName()以获取属性名称,并使用getKind()来确定节点的类型。

关于2,ConstraintViolation#的getMessage()给你插的错误信息

我不知道,当你说你不希望使用属性文件你的意思。 Bean验证将默认从属性文件(无论是内置的还是添加到应用程序的)读取错误消息。

+0

1.)Field表示bean变量/属性。不是“场”。如果我指定了@NotNull,并且如果该变量失败了这个约束,我需要能够获取消息2.)使用关于错误消息的搜索功能可以使用Bean验证错误消息的属性文件返回示例。但是,我不打算使用它。 –