# Java EE/Restrições Embutidas
## 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

@NotNull define que a variável anotada não pode conter null. Enquanto @Null define que apenas null seja referenciado pela variável.

### AssertTrue e AssertFalse

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

### Max e Min

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

### DecimalMax e DecimalMin

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

### Digits

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

### Size

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

### Pattern

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

Pattern.Flag.CANON_EQ sinaliza que um caractere Unicode na expressão regular pode corresponder à sua forma canonicamente decomposta.
No exemplo abaixo o caracter é (\u00e9) foi decomposto em ´ (\u0301) e e (\u0065) para a definição da expressão regular.

#### Pattern.Flag.CASE_INSENSITIVE

A flag Pattern.Flag.CASE_INSENSITIVE permite que os caracteres na expressão regular correspondam em sua forma maiúscula ou minúscula.
No código abaixo, categoriaCNH é aceito pela validação por conta da flag.

#### Pattern.Flag.COMMENTS

Pattern.Flag.COMMENTS permite que espaços em branco e comentários na expressão regular sejam ignorados na correspondência. # inicia os comentários na expressão regular.
A String a é aceita pela validação já que os caracteres após # na expressão regular são ignorados bem como o espaço em branco na expressão regular da anotação na variável sigla.

#### Pattern.Flag.DOTALL

A flag Pattern.Flag.DOTALL possibilita que a expressão regular . possa corresponder com caracteres de terminação de linha.

#### Pattern.Flag.LITERAL

Pattern.Flag.LITERAL

#### Pattern.Flag.MULTILINE

Pattern.Flag.MULTILINE

#### Pattern.Flag.UNICODE_CASE

Pattern.Flag.UNICODE_CASE

#### Pattern.Flag.UNICODE_CHARACTER_CLASS

Pattern.Flag.UNICODE_CHARACTER_CLASS

#### Pattern.Flag.UNIX_LINES

Pattern.Flag.UNIX_LINES

### Future e Past

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

## Duplicação de restrições

É possível utilizar diversas restrições para um mesmo campo.
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).