É possível implementar ordem nas validações de Bean Validation? Para cada campo eu tenho três anotações @NotNull, @Size e @Text, a validação de @Text sempre esta sendo executada!
Ex.: Na minha entity abaixo gostaria que fosse exibidas as mensagens de validação de acordo com alguns critérios.
1º - Se o campo não tiver preenchido mostrar apenas a mensagem do @NotNull
2º - Caso tenha sido preenchido mas não tenha entre 2 e 20 caracteres mostrar apenas a mensagem do @Size
3º - Caso tenha sido preenchido e tenha o tamanho entre 2 e 20 porém tem caracteres inválidos mostrar apenas a mensagen @Text
Isso é possivel?
Só para que tenham uma idéia segue abaixo o resultado das validações atual!
? nome deve ter apenas letras // vem de @Text (QUERO QUE SEJA EXECUTADA APENAS SE O CAMPO FOR PREENCHIDO)
? preencher o campo nome // vem de @NotNull
? preencher o campo sobrenome // vem de @NotNull
? o sobrenome deve ter apenas letras // vem de @Text (QUERO QUE SEJA EXECUTADA APENAS SE O CAMPO FOR PREENCHIDO)
@Entity
@Table(name = "user")
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id_user")
private Long idUser;
@NotNull(message="{0009}")
@Size(min=2,max=20,message="{0003}")
@Text(message="{0005}")
@Basic(optional = false)
@Column(name = "first_name")
private String firstName;
@NotNull(message="{0010}")
@Size(min=2,max=40,message="{0006}")
@Text(message="{0008}")
@Basic(optional = false)
@Column(name = "last_name")
private String lastName;
}
// @Text
@Target({ElementType.METHOD,ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy=TextValidator.class)
public @interface Text {
String message() default "";
Class[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
public class TextValidator implements ConstraintValidator<Text, String> {
@Override
public void initialize(Text constraintAnnotation) {}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if (value == null) return false;
return isText(value);
}
private boolean isText(String value) {
Pattern p = Pattern.compile("^[A-Za-zÀÁÂÃÄÇÈÉÊËÌÍÎÏÑÒÓÔÕÖÙÚÛÜÝàáâãäçèéêëìíîïñòóôõöùúûüý ]*$");
Matcher m = p.matcher(value);
return m.matches();
}
}