Java EE/Bean Validaton: diferenças entre revisões

[edição verificada][edição verificada]
Conteúdo apagado Conteúdo adicionado
Linha 67:
 
É importante notar que apesar de a validação não permitir que a variável receba <code>null</code>, na instanciação do ''Bean'' <code>String nome</code> é inicializada com <code>null</code> como é padrão na plataforma Java SE. A primeira validação ocorre apenas quando é feita a primeira submissão dos dados do <code>form</code>.
 
==Restrições embutidas==
O pacote <code>[https://docs.oracle.com/javaee/7/api/javax/validation/constraints/package-summary.html javax.validation.constraints]</code> contém as restrições definidas pela API.
 
Abaixo são descritas todas as anotações contidas no pacote citado. Caso um tipo primitivo seja utilizado, ele será convertido no objeto wrapper correspondente para a realização da validação.
 
<hr>
<code>@NotNull</code>, conforme vista na seção anterior, define que a variável anotada não pode ser nula. Qualquer tipo de variável de referência pode ser utilizado.
 
<code>@Null</code> restringe de forma oposta à <code>@NotNull</code>, definindo que a variável anotada deve apenas ser <code>null</code>.
<source lang="Java">
@Null
Object obj;
</source>
<hr>
 
<code>@AssertTrue</code> define que a variável deve ser <code>true</code>. Já <code>@AssertFalse</code> define o contrário. Obviamente apenas os tipos <code>Boolean</code> e <code>boolean</code> podem ser utilizados.
<source lang="Java">
@AssertFalse
Boolean ligado; //Caso vincule com um componente <h:selectBooleanCheckbox> não esqueça de inicializá-la com true ou false!
 
@AssertTrue
boolean funcionando;
</source>
<hr>
 
<code>@Max</code> restringe a variável a armazenar valor igual ou menor ao que essa anotação define. <code>@Min</code> restringe de forma inversa. Apenas valores do tipo <code>long</code> são suportados no elemento <code>value</code> dessas anotações.
 
<code>BigDecimal</code>, <code>BigInteger</code>, <code>long</code>, <code>int</code>, <code>short</code>, <code>byte</code> e seus objetos wrapper respectivos são suportados pelas anotações. <code>double</code> e <code>float</code> não são suportados devido ao seu erro de arredondamento.
 
Adicionalmente o tipo <code>String</code> também é suportado apesar de não constar na especificação.
<source lang="Java">
@Max(42)
BigDecimal num;
 
@Min(50)
int valor; //Será inicializado com 0 caso vinculado com <h:inputText>, porém a validação só ocorrerá na primeira submissão dos dados para o servidor.
</source>
<hr>
 
<code>@DecimalMax</code> e <code>@DecimalMin</code> são similares às de <code>@Max</code> e <code>@Min</code>, com a diferença de que seus elementos <code>value</code> são de tipo <code>String</code> e suportam valores decimais (na implementação esse elemento é convertido em BigDecimal).
 
<source lang="Java">
@DecimalMax("200.77")
long num;
 
@DecimalMin(".5")
Short valor;
</source>
<hr>
 
<code>@Digits</code> restringe a quantidade '''máxima''' de dígitos que uma variável pode conter. O elemento <code>int integer</code> restringe os dígitos inteiros e o <code>int fraction</code> os decimais. Ambos os elementos são obrigatórios.
 
<code>BigDecimal</code>, <code>BigInteger</code>, <code>CharSequence</code> (<code>StringBuilder</code> e <code>String</code> p. ex.), <code>long</code>, <code>int</code>, <code>short</code>, <code>byte</code> e seus objetos wrapper respectivos são suportados pelas anotações.
 
Note que ao utilizar alguma classe que implemente <code>CharSequence</code> como tipo de uma variável anotada com <code>@Digits</code> somente números serão valores válidos.
 
<source lang="Java">
@Digits(integer = 2, fraction = 1)
String valor;
 
@Digits(integer = 2, fraction = 1)
Long numero; //Obviamente fraction é despropositado aqui, mas a funcionalidade de integer permanece.
</source>
<hr>
 
<code>@Size</code> restringe a quantidade mínima e/ou máxima de caracteres que a variável anotada pode conter e de elementos que uma coleção pode ter. O elemento <code>int min</code> define o a quantidade mínima e o <code>int max</code> a máxima. Ambos os elementos são opcionais, seus valores padrão são 0 e <code>Integer.MAX_VALUE</code> respectivamente.
 
<code>CharSequence</code>, <code>Collection</code> (<code>ArrayList</code> e <code></code> p. ex.), <code>Map</code> e vetores são tipos suportados.
 
<source lang="Java">
@Size(min = 1, max = 5)
ArrayList<SelectItem> vetor;
 
@Size(min = 1, max = 5)
String palavra;
</source>
<hr>
 
<code>@Pattern</code> restringe o conteúdo da variável obedecer à uma expressão regular. O elemento obrigatório <code>String regexp</code> define a expressão regular.
 
<source lang="Java">
@Pattern(regexp = "[A-Ea-e]")
String categoriaCNH;
</source>
<hr>
 
O elemento opcional opcional <code>Pattern.Flag[] flags</code> define alterações sobre a expressão regular especificada. Seu padrão é vazio.
 
<source lang="Java">
@Pattern(regexp = "[A-E]", flags = Pattern.Flag.CASE_INSENSITIVE)
String categoriaCNH; //a flag definida permite que as letras sejam válidas maiúsculas ou não.
</source>
<hr>
 
<code>@Future</code> e <code>@Past</code> definem que as variáveis representem apenas data futura ou passada, respectivamente.
 
Apenas <code>java.util.Date</code> e <code>Calendar</code> são tipos suportados para essas anotações. Provavelmente na próxima versão da especificação Bean Validation os tipos <code>LocalDate</code> e <code>LocalDateTime</code> serão suportados.
 
<source lang="Java">
@Future
Date previsaoFormacao;
 
@Past
Calendar aniversario;
</source>
 
==Anotação interna List==