Bean Validation - Tem algo errado com minha anotação?

1 resposta
S

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

1 Resposta

E

sbb_20, bom se você por a anotação @NotNull(message=""),
com uma mensagem e ao invéz da anotação @size, utilizar a anotação @length(min = 2, max=20)
uma parte das necessidades seria contemplada!

Até mais

Criado 16 de setembro de 2011
Ultima resposta 26 de out. de 2011
Respostas 1
Participantes 2