Java EE/Restrições Embutidas: diferenças entre revisões

Origem: Wikilivros, livros abertos por um mundo aberto.
[edição verificada][edição verificada]
Conteúdo apagado Conteúdo adicionado
Sem resumo de edição
Sem resumo de edição
Linha 1: Linha 1:
==Integração JSF e Bean Validation ==
A especificação [http://download.oracle.com/otndocs/jcp/jsf-2_2-fr-eval-spec/index.html JSR 344 - Java Server Faces 2.2] em sua seção 3.5.6 especifica a integração com o [http://download.oracle.com/otndocs/jcp/bean_validation-1.0-fr-oth-JSpec/ JSR 303 - Bean Validation 1.0] versão anterior à [http://download.oracle.com/otndocs/jcp/bean_validation-1_1-fr-eval-spec/ JSR 349 - Bean Validation 1.1].

Apenas os valores dos componentes JSF que implementam <code>EditableValueHolder</code> são validados e tem a mensagem de violação exibida automaticamente, ou seja, sem uma instância de <code>javax.validation.Validator</code> e sem a adição de uma mensagem em <code>FacesContext</code>.

==Constraints==
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.
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.
Abaixo são descritas todas as anotações contidas no pacote citado.


<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>@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.


Linha 50: Linha 55:
<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>@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.
<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 pela anotação.


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.
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.
Linha 85: Linha 90:
O elemento opcional opcional <code>Pattern.Flag[] flags</code> define alterações sobre a expressão regular especificada. Seu padrão é vazio.
O elemento opcional opcional <code>Pattern.Flag[] flags</code> define alterações sobre a expressão regular especificada. Seu padrão é vazio.


As flags abaixo listadas são as mesmas constantes no objeto <code> [https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html Pattern] </code> do Java SE 8.
As flags abaixo listadas são as mesmas constantes no objeto <code> [https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html java.util.regex.Pattern] </code> do Java SE 8.


<source lang="Java">
<source lang="Java">

Revisão das 20h57min de 11 de dezembro de 2015

Integração JSF e Bean Validation

A especificação JSR 344 - Java Server Faces 2.2 em sua seção 3.5.6 especifica a integração com o JSR 303 - Bean Validation 1.0 versão anterior à JSR 349 - Bean Validation 1.1.

Apenas os valores dos componentes JSF que implementam EditableValueHolder são validados e tem a mensagem de violação exibida automaticamente, ou seja, sem uma instância de javax.validation.Validator e sem a adição de uma mensagem em FacesContext.

Constraints

O pacote javax.validation.constraints contém as restrições definidas pela API.

Abaixo são descritas todas as anotações contidas no pacote citado.

@NotNull, 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.

@Null restringe de forma oposta à @NotNull, definindo que a variável anotada deve apenas ser null.

@Null
Object obj;

@AssertTrue define que a variável deve ser true. Já @AssertFalse define o contrário. Obviamente apenas os tipos Boolean e boolean podem ser utilizados.

@AssertFalse
Boolean ligado; //Caso vincule com um componente <h:selectBooleanCheckbox> não esqueça de inicializá-la com true ou false!

@AssertTrue
boolean funcionando;

@Max restringe a variável a armazenar valor igual ou menor ao que essa anotação define. @Min restringe de forma inversa. Apenas valores do tipo long são suportados no elemento value dessas anotações.

BigDecimal, BigInteger, long, int, short, byte e seus objetos wrapper respectivos são suportados pelas anotações. double e float não são suportados devido ao seu erro de arredondamento.

Adicionalmente o tipo String também é suportado apesar de não constar na especificação.

@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.

@DecimalMax e @DecimalMin são similares às de @Max e @Min, com a diferença de que seus elementos value são de tipo String e suportam valores decimais (na implementação esse elemento é convertido em BigDecimal).

@DecimalMax("200.77")
long num;

@DecimalMin(".5")
Short valor;

@Digits restringe a quantidade máxima de dígitos que uma variável pode conter. O elemento int integer restringe os dígitos inteiros e o int fraction os decimais. Ambos os elementos são obrigatórios.

BigDecimal, BigInteger, CharSequence (StringBuilder e String p. ex.), long, int, short, byte e seus objetos wrapper respectivos são suportados pela anotação.

Note que ao utilizar alguma classe que implemente CharSequence como tipo de uma variável anotada com @Digits somente números serão valores válidos.

@Digits(integer = 2, fraction = 1)
String valor; 

@Digits(integer = 2, fraction = 1)
Long numero; //Obviamente fraction é despropositado aqui, mas a funcionalidade de integer permanece.

@Size 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 int min define o a quantidade mínima e o int max a máxima. Ambos os elementos são opcionais, seus valores padrão são 0 e Integer.MAX_VALUE respectivamente.

CharSequence, Collection (ArrayList e p. ex.), Map e vetores são tipos suportados.

@Size(min = 1, max = 5)
ArrayList<SelectItem> vetor; 

@Size(min = 1, max = 5)
String palavra;

@Pattern restringe o conteúdo da variável a obedecer à uma expressão regular. O elemento obrigatório String regexp define a expressão regular.

@Pattern(regexp = "[A-Ea-e]")
String categoriaCNH;

O elemento opcional opcional Pattern.Flag[] flags define alterações sobre a expressão regular especificada. Seu padrão é vazio.

As flags abaixo listadas são as mesmas constantes no objeto java.util.regex.Pattern do Java SE 8.

@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.

Pattern.Flag.CANON_EQ

Pattern.Flag.CASE_INSENSITIVE

Pattern.Flag.COMMENTS

Pattern.Flag.DOTALL

Pattern.Flag.LITERAL

Pattern.Flag.MULTILINE

Pattern.Flag.UNICODE_CASE

Pattern.Flag.UNICODE_CHARACTER_CLASS

Pattern.Flag.UNIX_LINES



@Future e @Past definem que a variável represente apenas data futura ou passada, respectivamente.

Apenas java.util.Date e Calendar são tipos suportados para essas anotações. Provavelmente na próxima versão da especificação Bean Validation os tipos LocalDate e LocalDateTime serão suportados.

@Future
Date previsaoFormacao;

@Past
Calendar aniversario;

Duplicação de restrições

É possível utilizar diversas restrições para um mesmo campo.

@NotNull
@Digits(integer = 1, fraction = 3)
@Max(5)
BigDecimal precoLitroCombustivel;

No entanto uma anotação não pode ser duplicada em um campo sem a utilização da anotação interna List presente em todas as anotações embutidas (que vêm junto da API).