Java EE/Bean Validaton: diferenças entre revisões
[edição verificada] | [edição verificada] |
Linha 67: | 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>. |
É 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== |
==Anotação interna List== |
Revisão das 13h14min de 9 de dezembro de 2015
Bean Validation é a especificação definida pela JSR 349 para definição de restrições e validações de dados para a plataforma Java SE e EE. Sua implementação de referência é o Hibernate Validator.
Demonstração simples
Será demonstrada uma simples validação de campo em página web que restringe o preenchimento de campo para valor não vazio.
Para atingirmos tal objetivo, utilizaremos uma página XHTML
com um h:message
apontando para um h:inputText
vinculado a uma variável String de um Backing Bean. Essa variável será anotada com @NotNull
. Ao submeter o formulário com o campo vazio, uma mensagem de validação será renderizada pelo servidor no componente h:message
.
Para executar os seguintes códigos é necessário que o descritor de implantação web.xml
esteja configurado para que campos vazios sejam convertidos em null
ao invés do comportamento padrão de conversão em Strings vazias.
<context-param>
<param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name>
<param-value>true</param-value>
</context-param>
No Bean abaixo a variável de referência String Nome
é restringida com a anotação @NotNull
para que não seja null
.
package org.wikibooks.pt.javaee;
import javax.enterprise.inject.Model;
import javax.validation.constraints.NotNull;
@Model
public class Usuario {
@NotNull
private String nome;
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
}
O XHTML
abaixo gerará a página Web com o campo que sofrerá a validação.
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html">
<head>
<title>Conhecendo as restrições embutidas</title>
</head>
<body>
<h:form id="formulario">
<h:panelGrid columns="3" cellpadding="5">
<h:outputLabel for="nome" value="Nome" />
<h:inputText id="nome" value="#{usuario.nome}" />
<h:message for="nome" />
<h:panelGroup />
<h:commandButton value="Enviar dados" style="float:right" />
</h:panelGrid>
</h:form>
</body>
</html>
Ao clicar no botão Enviar dados com o campo Nome em branco será exibida a mensagem não pode ser nulo.
É importante notar que apesar de a validação não permitir que a variável receba null
, na instanciação do Bean String nome
é inicializada com null
como é padrão na plataforma Java SE. A primeira validação ocorre apenas quando é feita a primeira submissão dos dados do form
.