Java EE/Bean Validaton: 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
Linha 73: Linha 73:
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. 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>@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 126: Linha 127:
@Digits(integer = 2, fraction = 1)
@Digits(integer = 2, fraction = 1)
String valor;
String valor;

@Digits(integer = 2, fraction = 1)
Long numero; //Obviamente fraction é despropositado aqui, mas a funcionalidade de integer permanece.
</source>
</source>
<hr>
<hr>
Linha 135: Linha 139:
<source lang="Java">
<source lang="Java">
@Size(min = 1, max = 5)
@Size(min = 1, max = 5)
ArrayList<Integer> vetor;
ArrayList<SelectItem> vetor;

@Size(min = 1, max = 5)
String palavra;
</source>
</source>
<hr>
<hr>


<code>@Pattern</code> restringe o conteúdo da variável obedecer à uma expressão regular. O elemento <code>String regexp</code> define a expressão regular.
<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">
<source lang="Java">
Linha 145: Linha 152:
String categoriaCNH;
String categoriaCNH;
</source>
</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.
<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.
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==

Revisão das 00h33min 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.

Restrições embutidas

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. Caso um tipo primitivo seja utilizado, ele será convertido no objeto wrapper correspondente para a realização da validação.


@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 pelas anotações.

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

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

@Future e @Past definem que as variáveis representem 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;

Anotação interna List