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

Anotação interna List