Dropwizard自定义验证注释无效

时间:2016-07-01 21:08:26

标签: java validation jersey dropwizard

我正在尝试使用自定义验证注释一次应用多个常用注释:

@Retention(RetentionPolicy.RUNTIME)
@Length(max=25, min=1, message="invalid length")
@NotNull
@Pattern(regexp = "[a-zA-Z0-9]{1, 25})")
public @interface MyAnnotation {
}

在我的模型类中使用它:

@MyAnnotation
public String firstName;

这些验证都不起作用,但在模型类本身使用时它们按预期工作。我也尝试在应用程序运行方法中注册MyAnnotation,但这也不起作用。

environment.jersey().register(MyAnnotation.class);

为了使用自定义验证,我还需要做些什么?

2 个答案:

答案 0 :(得分:0)

直接注释String:

@Pattern(regexp = "[a-zA-Z0-9]{1, 25})")
@NotNull
@Length(max=25, min=1, message="invalid length")
public String firstName; 

或者创建一个验证器,例如:

class MyAnnotatationValidator implements ConstraintValidator<MyAnnotation, String>{
  @Override
  public void initialize(MyAnnotation a){}
  @Override
  public boolean isValid(String s, ConstraintValidationContext c) {
    return s != null && (s.length() > 0 && s.length() < 26) && s.matches("[a-zA-Z0-9]{1, 25})";  
  }
}

并且

@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy=MyAnnotatationValidator.class)
public @interface MyAnnotation {
  String message() default = "{MyAnnotation}";
  Class<?>[] groups() default {};
  Class<? extends Payload> payload() deafult {};
}

答案 1 :(得分:0)

根据JSR-303

  

约束定义可能具有在将约束应用于JavaBean时指定的属性。属性将映射为注释元素。注释元素名称消息,组和有效负载被视为保留名称;不允许以有效开头的注释元素;约束可以使用任何其他元素名称作为其属性。

因此,您必须向@MyAnnotation添加消息,组和有效内容属性 通过注释组合约束来完成合成,例如:

@Length(max=25, min=1, message="invalid length")
@NotNull
@Pattern(regexp = "[a-zA-Z0-9]{1, 25})")
@Documented
@Target({ANNOTATION_TYPE, METHOD, FIELD, CONSTRUCTOR, PARAMETER})
@Retention(RUNTIME)
public @interface MyAnnotation {
    String message() default "My annotation message";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}