<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>blog.caelum.com.br &#187; jsr</title>
	<atom:link href="http://blog.caelum.com.br/tag/jsr/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.caelum.com.br</link>
	<description>blog dos desenvolvedores da Caelum</description>
	<lastBuildDate>Thu, 09 Feb 2012 13:04:59 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Java EE 6: Começando com Bean Validation</title>
		<link>http://blog.caelum.com.br/java-ee-6-comecando-com-bean-validation/</link>
		<comments>http://blog.caelum.com.br/java-ee-6-comecando-com-bean-validation/#comments</comments>
		<pubDate>Thu, 04 Feb 2010 00:12:26 +0000</pubDate>
		<dc:creator>Lucas Souza</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[bean validation]]></category>
		<category><![CDATA[fj-26]]></category>
		<category><![CDATA[hibernate]]></category>
		<category><![CDATA[hibernate validator]]></category>
		<category><![CDATA[javaee]]></category>
		<category><![CDATA[javaee6]]></category>
		<category><![CDATA[jpa]]></category>
		<category><![CDATA[jsf]]></category>
		<category><![CDATA[jsr]]></category>
		<category><![CDATA[validation]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/?p=1847</guid>
		<description><![CDATA[Não existe tarefa mais comum hoje em dia do que validar dados em uma aplicação. Por exemplo, validamos se na camada de apresentação o usuário preencheu algum campo obrigatório, depois fazemos a mesma lógica de validação em nossa regra de negócio e por último validamos se os dados que serão salvos no banco também estão <a href="http://blog.caelum.com.br/java-ee-6-comecando-com-bean-validation/#more-1847'" class="more-link">more &#187;</a>]]></description>
			<content:encoded><![CDATA[<p>Não existe tarefa mais comum hoje em dia do que validar dados em uma aplicação. Por exemplo, validamos se na camada de apresentação o usuário preencheu algum campo obrigatório, depois fazemos a mesma lógica de validação em nossa regra de negócio e por último validamos se os dados que serão salvos no banco também estão corretos. O que na maioria das vezes os desenvolvedores fazem é validar estas regras em todos os lugares, e muitas vezes resulta em validações complicadas e possíveis erros na aplicação. Muitos desenvolvedores consideram essa tarefa enfadonha.</p>
<p>Na nova versão do Java EE lançada dezembro de 2009 existem grandes novidades: <a href="http://blog.caelum.com.br/java-ee6-comecando-com-as-servlets-3-0/">Servlets 3.0</a>, JAX-RS, CDI, JSF 2.0 e a <strong>Bean Validation</strong>, definida pela <a href="http://jcp.org/en/jsr/detail?id=303">JSR 303</a>. Com a Bean Validation é possível realizarmos validações atráves de metadados (anotações) e as utilizarmos em todas as camadas de nossa aplicação.</p>
<p>Podemos até mesmo criar nossas próprias regras de validações e aplicarmos em outros pontos do nosso sistema. Essas regras podem ser facilmente integradas com JPA e JSF, por exemplo. Vamos considerar uma classe que represente um contato:</p>
<pre class="brush: java; title: ; notranslate">
public class Contato {

  private String nome;

  private String email;

  // getters e setters

  public void enviaEmail() {
    // codigo envio de email
  }
}
</pre>
<p>E vamos adicionar nossas regras de validação utilizando a Bean Validation:</p>
<pre class="brush: java; title: ; notranslate">
public class Contato {

  @NotEmpty
  @Pattern(regexp = &quot;.+@.+\\.[a-z]+&quot;)
  private String email;

  @NotEmpty
  private String nome;

  // getters e setters

  public void enviaEmail() {
  // codigo envio de email
  }
}
</pre>
<p>A anotação <code>@NotEmpty</code> garante que o email não poderá ser vazio assim como o atributo nome. No atributo email também colocamos a anotação <code>@Pattern</code>, onde podemos passar qualquer expressão regular, que o Bean Validation validará o valor passado ao atributo <code>nome</code> com a expressão regular.</p>
<p>Lembrando que o Bean Validation é uma especificação e como toda especificação, para utilizarmos precisamos de uma implementação para a utilizarmos. A implementação usada nos exemplos é a  <a href="http://hibernate.org/subprojects/validator">Hibernate Validator</a>, e é a implementação de referência.</p>
<p><strong>Integrando com o JSF</strong></p>
<p>O código abaixo mostra um formulário simples utilizando JSF, que chama um método <code>enviaEmail </code>do ManagedBean quando clicamos no botão &#8220;<em>EnviaEmail</em>&#8220;:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;h:form id=&quot;formulario&quot;&gt;
     &lt;h:panelGrid columns=&quot;3&quot;&gt;
          &lt;h:inputText id=&quot;email&quot; value=&quot;#{contato.email}&quot;/&gt;
          &lt;h:message for=&quot;email&quot; styleClass=&quot;error&quot;/&gt;
          &lt;h:commandButton action=&quot;#{contato.enviaEmail}&quot;
               value=&quot;Enviar Email&quot;/&gt;
     &lt;/h:panelGrid&gt;
&lt;/h:form&gt;
</pre>
<p>Precisamos ainda anotar nossa classe <code>Contato</code> com <code>@ManagedBean(name="contato")</code> e <code>@RequestScoped</code> para que a mesma seja um ManageBean e consiga integrar-se com o JSF.<br />
Quando clicarmos no botão &#8220;<em>Enviar Email</em>&#8221; automaticamente será validado se o atributo <code>email </code>foi preenchido a atende a expressão regular da anotação <code>@Pattern</code>.</p>
<p>Podemos muitas vezes nos deparar com algum caso onde é necessário fazermos uma validação um pouco mais específica, algo que não esteja implementado por padrão no Bean Validation. Validar um CEP seria um bom exemplo. O primeiro passo para fazermos nossa própria validação é criar uma anotação que sugira o nome desta validação.</p>
<pre class="brush: java; title: ; notranslate">
@Constraint(validatedBy = CepValidator.class)
@Documented
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Cep {

  String message() default &quot;Cep inválido&quot;;
  Class&lt;?&gt;[] groups() default { };
  Class&lt;? extends Payload&gt;[] payload() default { };

}
</pre>
<p>Reparem que em nenhum momento fizemos de fato a validação se o CEP é válido ou não. Por isso anotamos a anotação CEP que acabamos de criar com <code>@Constraint</code> e setamos o atributo <code>validatedBy </code>com a classe que está nossa validação realmente.<br />
O próximo passo é criarmos a classe <code>CEPValidator</code> que fará a validação. Esta classe tem que obrigatóriamente implementar a interface <code>javax.validation.ConstraintValidator</code>:</p>
<pre class="brush: java; title: ; notranslate">
public class CepValidator implements
            ConstraintValidator&lt;Cep, String&gt; {

  private Pattern pattern =
          Pattern.compile(&quot;[0-9]{5}-[0-9]{3}&quot;);

  @Override
  public void initialize(Cep constraintAnnotation) {

  }

  @Override
  public boolean isValid(String value,
           ConstraintValidatorContext context) {
    Matcher m = pattern.matcher(value);
    return m.matches();
  }

}
</pre>
<p>No método <code>isValid</code> verificamos e retornamos um booleano dizendo se a <code>String</code> passada como argumento está de acordo com a expressão regular que criamos no topo da classe. Podemos agora validar qualquer atributo de algum Java Bean, devendo apenas anotar o atributo com a nossa recém criada <code>@CEP</code>. Por exemplo:</p>
<pre class="brush: java; title: ; notranslate">
public class Contato {

  @Cep
  private String cep;

  // getters e setters
}
</pre>
<p>Para rodar esse exemplo precisamos de um servidor de aplicação compatível com o Java EE 6, como o Glassfish 3.0. A premissa do Bean Validation é que muitos outros frameworks acabem por adotar um único mecanismo de validação, sendo possível reaproveitar o código criado aqui. O <a href="http://stella.caelum.com.br/">Caelum Stella</a>, que fornece diversos validadores para sistemas que envolvem o domínio brasileiro, em breve será compatível com essa especificação, possibilitando que você utilize-o em todas as <a href="http://www.caelum.com.br/curso/formacao-consultor-java-ee-avancado/">diversas especificações que compões o Java EE</a>.</p>
<p>Além disso precisamos de um Servidor de Aplicação compatível com a versão 6 do Java EE. Por enquanto o único servidor que implementa essa versão é o Glassfish v3.0 que por sinal também é uma implementação de referência.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/java-ee-6-comecando-com-bean-validation/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
	</channel>
</rss>

