Java EE/Restrições Embutidas: diferenças entre revisões
[edição verificada] | [edição verificada] |
Linha 11: | Linha 11: | ||
Abaixo são descritas todas as anotações contidas no pacote citado. |
Abaixo são descritas todas as anotações contidas no pacote citado. |
||
===NotNull=== |
|||
<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 18: | Linha 19: | ||
Object obj; |
Object obj; |
||
</source> |
</source> |
||
⚫ | |||
===AssertTrue e AssertFalse=== |
|||
<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. |
<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"> |
<source lang="Java"> |
||
Linha 28: | Linha 29: | ||
boolean funcionando; |
boolean funcionando; |
||
</source> |
</source> |
||
⚫ | |||
===Max e Min=== |
|||
<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>@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. |
||
Linha 42: | Linha 43: | ||
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. |
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> |
</source> |
||
⚫ | |||
===DecimalMax e DecimalMin=== |
|||
<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). |
<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). |
||
Linha 53: | Linha 54: | ||
Short valor; |
Short valor; |
||
</source> |
</source> |
||
⚫ | |||
===Digits=== |
|||
<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. |
||
Linha 68: | Linha 69: | ||
Long numero; //Obviamente fraction é despropositado aqui, mas a funcionalidade de integer permanece. |
Long numero; //Obviamente fraction é despropositado aqui, mas a funcionalidade de integer permanece. |
||
</source> |
</source> |
||
⚫ | |||
===Size=== |
|||
<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>@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. |
||
Linha 81: | Linha 82: | ||
String palavra; |
String palavra; |
||
</source> |
</source> |
||
⚫ | |||
===Pattern=== |
|||
<code>@Pattern</code> restringe o conteúdo da variável a obedecer à uma expressão regular. O elemento obrigatório <code>String regexp</code> define a expressão regular. |
<code>@Pattern</code> restringe o conteúdo da variável a obedecer à uma expressão regular. O elemento obrigatório <code>String regexp</code> define a expressão regular. |
||
Linha 94: | Linha 95: | ||
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. |
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. |
||
⚫ | |||
<code>Pattern.Flag.CANON_EQ </code> sinaliza que um caractere Unicode na expressão regular pode corresponder à sua forma canonicamente decomposta. |
<code>Pattern.Flag.CANON_EQ </code> sinaliza que um caractere Unicode na expressão regular pode corresponder à sua forma canonicamente decomposta. |
||
Linha 106: | Linha 108: | ||
String s = "é"; |
String s = "é"; |
||
</source> |
</source> |
||
⚫ | |||
A flag <code>Pattern.Flag.CASE_INSENSITIVE</code> permite que os caracteres na expressão regular correspondam em sua forma maiúscula ou minúscula. |
A flag <code>Pattern.Flag.CASE_INSENSITIVE</code> permite que os caracteres na expressão regular correspondam em sua forma maiúscula ou minúscula. |
||
Linha 117: | Linha 119: | ||
String categoriaCNH = "a"; |
String categoriaCNH = "a"; |
||
</source> |
</source> |
||
⚫ | |||
<code>Pattern.Flag.COMMENTS</code> permite que espaços em branco e comentários na expressão regular sejam ignorados na correspondência. <code>#</code> inicia os comentários na expressão regular. |
<code>Pattern.Flag.COMMENTS</code> permite que espaços em branco e comentários na expressão regular sejam ignorados na correspondência. <code>#</code> inicia os comentários na expressão regular. |
||
A |
A String <code>a</code> é aceita pela validação já que os caracteres após <code>#</code> na expressão regular são ignorados bem como o espaço em branco na expressão regular da anotação na variável <code>sigla</code>. |
||
<source lang="Java"> |
<source lang="Java"> |
||
Linha 130: | Linha 133: | ||
String sigla = "ABC"; |
String sigla = "ABC"; |
||
</source> |
</source> |
||
⚫ | |||
<code>Pattern.Flag.DOTALL</code> |
<code>Pattern.Flag.DOTALL</code> |
||
⚫ | |||
<code>Pattern.Flag.LITERAL</code> |
<code>Pattern.Flag.LITERAL</code> |
||
⚫ | |||
<code>Pattern.Flag.MULTILINE</code> |
<code>Pattern.Flag.MULTILINE</code> |
||
⚫ | |||
<code>Pattern.Flag.UNICODE_CASE</code> |
<code>Pattern.Flag.UNICODE_CASE</code> |
||
<hr/> |
|||
<code>Pattern.Flag.UNICODE_CHARACTER_CLASS</code> |
<code>Pattern.Flag.UNICODE_CHARACTER_CLASS</code> |
||
<hr/> |
|||
<code>Pattern.Flag.UNIX_LINES</code> |
<code>Pattern.Flag.UNIX_LINES</code> |
||
===Future e Past=== |
|||
⚫ | |||
<code>@Future</code> e <code>@Past</code> definem que a variável represente apenas data futura ou passada, respectivamente. |
<code>@Future</code> e <code>@Past</code> definem que a variável represente apenas data futura ou passada, respectivamente. |
||
Revisão das 13h52min de 28 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
@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 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.
@AssertFalse
Boolean ligado;
@AssertTrue
boolean funcionando;
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.
@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
@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
@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
@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
@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.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.
//Valores abaixo dependem da flag para que não haja violação das restrições.
@Pattern(regexp = "e\u0301", flags = Pattern.Flag.CANON_EQ)
char c = "\u00e9";
@Pattern(regexp = "\u0065\u0301", flags = Pattern.Flag.CANON_EQ)
String s = "é";
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.
//O mesmo que definir "[A-Ea-e]" em regexp
@Pattern(regexp = "[A-E]", flags = Pattern.Flag.CASE_INSENSITIVE)
String categoriaCNH = "a";
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
.
//O mesmo que definir "[A-Ea-e]" em regexp
@Pattern(regexp = "a#comentario", flags = Pattern.Flag.COMMENTS)
String palavra = "a";
@Pattern(regexp = "A B C", flags = Pattern.Flag.COMMENTS)
String sigla = "ABC";
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
@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).