<?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>Lucas Teixeira &#187; Spring</title>
	<atom:link href="http://lucastex.com.br/tag/spring/feed/" rel="self" type="application/rss+xml" />
	<link>http://lucastex.com.br</link>
	<description>@lucastex</description>
	<lastBuildDate>Mon, 19 Jul 2010 11:39:24 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>[GSolr] Beans declarados automagicamente</title>
		<link>http://lucastex.com.br/2010/02/28/gsolr-beans-declarados-automagicamente/</link>
		<comments>http://lucastex.com.br/2010/02/28/gsolr-beans-declarados-automagicamente/#comments</comments>
		<pubDate>Mon, 01 Mar 2010 02:18:23 +0000</pubDate>
		<dc:creator>Lucas Teixeira</dc:creator>
				<category><![CDATA[GSolr]]></category>
		<category><![CDATA[Grails]]></category>
		<category><![CDATA[Solr]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[Spring]]></category>

		<guid isPermaLink="false">http://lucastex.com.br/?p=314</guid>
		<description><![CDATA[

GSolr, é o nome do plugin de solr que estamos fazendo de solr para grails. Para quem quiser acompanhar o trabalho, o repositório está no github: http://github.com/lucastex/gsolr.
Uma coisa que já está feita é a leitura da configuração do gsolr e a declaração mágica de beans, um para cada servidor solr que estiver configurado. Exemplificando, vamos [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Flucastex.com.br%252F2010%252F02%252F28%252Fgsolr-beans-declarados-automagicamente%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2FccV24J%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22%5BGSolr%5D%20Beans%20declarados%20automagicamente%22%20%7D);"></div>
<p>GSolr, é o nome do plugin de solr que estamos fazendo de solr para grails. Para quem quiser acompanhar o trabalho, o repositório está no github: <a href="http://github.com/lucastex/gsolr" target="_blank">http://github.com/lucastex/gsolr</a>.</p>
<p>Uma coisa que já está feita é a leitura da configuração do gsolr e a declaração <strong>mágica</strong> de beans, um para cada servidor solr que estiver configurado. Exemplificando, vamos imaginar que a configuração esteja declarando três servidores Solr que serão consultados:</p>
<pre class="brush: groovy;">gsolr {
   solr {
      produtos {
         (...)
      }
      noticias {
         (...)
      }
      usuarios {
         (...)
      }
   }
}</pre>
<p>Particularmente, achei bem interessante usar o nome da closure para o nome do servidor ao invés de termos um atributo <em>name = produtos</em> :)<br />
A mágica legal mesmo, é que o plugin vai ler esta configuração quando a aplicação for para o ar, e depois disso irá declarar / criar beans spring dinâmicamente, usando a Spring DSL. E os beans vão ter no nome a declaração feita na closure do usuário.</p>
<p>Ou seja, para os servidores <strong>solr</strong> declarados acima, o plugin irá declarar os Spring Beans <strong>produtosGSolr</strong>, <strong>noticiasGSolr</strong> e <strong>usuariosGSolr</strong> .</p>
<p>Desta maneira, vamos garantir que se você quiser o usar o plugin, o processo como um todo ficará o menos intrusivo possível, e você poderá usar os métodos (de pesquisa e outros) do GSolr apenas injetando o bean do servidor Solr que você quiser.</p>
<pre class="brush: groovy;">class PesquisaService {
   def noticiasGSolr

   def pesquisar = {
      (...)
   }
}</pre>
<p>Achei no mínimo, muito prático. Tudo isso graças a Spring DSL que temos em groovy. Com um pouco mais de tempo, coloco o procedimento passo a passo para declarar os beans desta maneira. Enquanto isso, conheça um pouco mais sobre a <a href="http://grails.org/doc/latest/guide/14.%20Grails%20and%20Spring.html#14.4%20The%20BeanBuilder%20DSL%20Explained" target="_blank">Spring DSL aqui</a>, ou veja o código fonte <a href="http://github.com/lucastex/gsolr/blob/master/GsolrGrailsPlugin.groovy" target="_blank">aqui</a> e também <a href="http://github.com/lucastex/gsolr/blob/master/src/groovy/org/gsolr/core/GSolrConfigParser.groovy" target="_blank">aqui</a>.</p>
<p>Tem alguma idéia ou sugestão para o plugin? Deixe um comentário!</p>

]]></content:encoded>
			<wfw:commentRss>http://lucastex.com.br/2010/02/28/gsolr-beans-declarados-automagicamente/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Como acessar uma taglib de dentro de um service</title>
		<link>http://lucastex.com.br/2010/02/03/como-acessar-uma-taglib-de-dentro-de-um-service/</link>
		<comments>http://lucastex.com.br/2010/02/03/como-acessar-uma-taglib-de-dentro-de-um-service/#comments</comments>
		<pubDate>Thu, 04 Feb 2010 00:35:31 +0000</pubDate>
		<dc:creator>Lucas Teixeira</dc:creator>
				<category><![CDATA[Grails]]></category>
		<category><![CDATA[controller]]></category>
		<category><![CDATA[dica]]></category>
		<category><![CDATA[service]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[taglib]]></category>

		<guid isPermaLink="false">http://lucastex.com.br/?p=277</guid>
		<description><![CDATA[

Uma situação que acontece muito, é a reutilização das funções de taglibs dentro dos controllers de sua aplicação grails. Isso é muito fácil de se fazer, basta chamar o método usando o objeto com o nome do namespace da taglib.
Ou seja, para usar dentro do controller a função de formatação de números, definida pela função [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Flucastex.com.br%252F2010%252F02%252F03%252Fcomo-acessar-uma-taglib-de-dentro-de-um-service%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2FblFNGk%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Como%20acessar%20uma%20taglib%20de%20dentro%20de%20um%20service%22%20%7D);"></div>
<p>Uma situação que acontece muito, é a reutilização das funções de taglibs dentro dos controllers de sua aplicação grails. Isso é muito fácil de se fazer, basta chamar o método usando o objeto com o nome do namespace da taglib.<br />
Ou seja, para usar dentro do controller a função de formatação de números, definida pela função formatNumber (<a href="http://grails.org/doc/latest/ref/Tags/formatNumber.html" target="_blank">taglib já no core do grails</a>), é só fazer a chamada assim:</p>
<pre class="brush: groovy;">def myAction = {
render g.formatNumber([number:5000.234, type: &quot;number&quot;, maxFractionDigits: 2])
}</pre>
<p>Esta função é equivalente a chamar a taglib de dentro de um gsp da seguinte maneira:</p>
<pre class="brush: xml;">&lt;g:formatNumber number=&quot;5000.234&quot; type=&quot;number&quot; maxFractionDigits=&quot;2&quot; /&gt;</pre>
<p>Mas quando precisamos fazer isto, por exemplo, dentro de um service, encontramos um probleminha chato, as taglibs não são injetadas automaticamente. Para contornar essa &#8220;<a href="http://upload.wikimedia.org/wikipedia/commons/7/7d/Bug.png" target="_blank">situação</a>&#8220;, temos que buscar a taglib manualmente, da seguinte maneira:</p>
<pre class="brush: groovy;">def myTag = grailsApplication.mainContext.
            getBean('org.codehaus.groovy.grails.plugins.web.taglib.ApplicationTagLib')
def value = myTag.formatNumber([number:5000.234, type: &quot;number&quot;, maxFractionDigits: 2])</pre>
<p>Ahhh, para isso não se esqueca de injetar o objeto da grailsApplication da seguinte maneira</p>
<pre class="brush: groovy;">class MeuService {
   def grailsApplication
   (...)
}</pre>
<p>Bin-go.</p>

]]></content:encoded>
			<wfw:commentRss>http://lucastex.com.br/2010/02/03/como-acessar-uma-taglib-de-dentro-de-um-service/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Como definir o locale default de sua aplicação grails</title>
		<link>http://lucastex.com.br/2010/01/26/como-definir-o-locale-default-de-sua-aplicacao-grails/</link>
		<comments>http://lucastex.com.br/2010/01/26/como-definir-o-locale-default-de-sua-aplicacao-grails/#comments</comments>
		<pubDate>Tue, 26 Jan 2010 12:05:33 +0000</pubDate>
		<dc:creator>Lucas Teixeira</dc:creator>
				<category><![CDATA[Grails]]></category>
		<category><![CDATA[bean]]></category>
		<category><![CDATA[i18n]]></category>
		<category><![CDATA[locale]]></category>
		<category><![CDATA[resources]]></category>
		<category><![CDATA[Spring]]></category>

		<guid isPermaLink="false">http://lucastex.com.br/?p=266</guid>
		<description><![CDATA[

Graças ao ótimo suporte de internacionalização que o grails nos proporciona, podemos alterar o idioma corrente da app passando apenas o parametro lang na URL. Com isso, o locale é definido para o usuário e se sua aplicação recupera as mensagens com o g:message ou outros recursos de i18n, usará o locale indicado.
Caso queira definir [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Flucastex.com.br%252F2010%252F01%252F26%252Fcomo-definir-o-locale-default-de-sua-aplicacao-grails%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2F4ZDOrp%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Como%20definir%20o%20locale%20default%20de%20sua%20aplica%C3%A7%C3%A3o%20grails%22%20%7D);"></div>
<p>Graças ao ótimo <a href="http://grails.org/doc/1.1/guide/single.html#10.%20Internationalization" target="_blank">suporte de internacionalização</a> que o grails nos proporciona, podemos alterar o idioma corrente da app passando apenas o parametro <strong>lang</strong> na URL. Com isso, o locale é definido para o usuário e se sua aplicação recupera as mensagens com o <strong>g:message</strong> ou outros recursos de i18n, usará o locale indicado.</p>
<p>Caso queira definir um locale default para sua app, basta sobrescrever o bean <strong>localeResolver</strong> no seu resources.groovy como abaixo:</p>
<pre class="brush: groovy;">beans = {
  localeResolver(org.springframework.web.servlet.i18n.SessionLocaleResolver) {
    defaultLocale = new Locale(&quot;pt&quot;, &quot;BR&quot;)
    java.util.Locale.setDefault(defaultLocale)
  }
}</pre>
<p>Sim, estou trazendo aos poucos tópicos que estavam em meu outro blog, blog.lucastex.com, dê uma passada por lá.</p>

]]></content:encoded>
			<wfw:commentRss>http://lucastex.com.br/2010/01/26/como-definir-o-locale-default-de-sua-aplicacao-grails/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Portal imobiliário usando Groovy e Grails</title>
		<link>http://lucastex.com.br/2010/01/10/portal-imobiliario-usando-groovy-e-grails/</link>
		<comments>http://lucastex.com.br/2010/01/10/portal-imobiliario-usando-groovy-e-grails/#comments</comments>
		<pubDate>Sun, 10 Jan 2010 13:05:34 +0000</pubDate>
		<dc:creator>Lucas Teixeira</dc:creator>
				<category><![CDATA[Grails]]></category>
		<category><![CDATA[Groovy]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[acegi]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[asp]]></category>
		<category><![CDATA[cookie]]></category>
		<category><![CDATA[GORM]]></category>
		<category><![CDATA[iis]]></category>
		<category><![CDATA[imob]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[locaweb]]></category>
		<category><![CDATA[mail]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[navigation]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[richui]]></category>
		<category><![CDATA[runtimelogging]]></category>
		<category><![CDATA[settings]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[sqlserver]]></category>
		<category><![CDATA[tomcat]]></category>

		<guid isPermaLink="false">http://lucastex.com.br/?p=220</guid>
		<description><![CDATA[

Ontem (dia 09/01) fizemos o lançamento de um site que desenvolvemos usando Groovy e Grails, um desafio e tanto, pela responsabilidade de colocar o sistema no ar e pelo timing do projeto. Todo o site e a integração com o sistema legado (onde algumas informações ainda estão sendo gerenciadas), tiveram que sair do simples &#8220;create [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Flucastex.com.br%252F2010%252F01%252F10%252Fportal-imobiliario-usando-groovy-e-grails%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2F7iywM2%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Portal%20imobili%C3%A1rio%20usando%20Groovy%20e%20Grails%22%20%7D);"></div>
<p>Ontem (dia 09/01) fizemos o lançamento de um site que desenvolvemos usando <a href="http://lucastex.com.br/tag/groovy/" target="_blank">Groovy</a> e <a href="http://lucastex.com.br/tag/grails/" target="_blank">Grails</a>, um desafio e tanto, pela responsabilidade de colocar o sistema no ar e pelo timing do projeto. Todo o site e a integração com o sistema legado (onde algumas informações ainda estão sendo gerenciadas), tiveram que sair do simples &#8220;<em>create app</em>&#8221; para produção em 2 meses. Esse é também o grande motivo para a falta de tempo de postar mais por aqui.</p>
<p>Trata-se dos sites <a href="http://www.imoveisnomorumbi.com.br" target="_blank">http://www.imoveisnomorumbi.com.br</a> e <a href="http://www.imoveisnopanamby.com.br" target="_blank">http://www.imoveisnopanamby.com.br</a>, site de duas imobiliárias do mesmo grupo, que negocia imóveis de alto padrão nestes dois bairros.</p>
<p>Algumas informações interessantes sobre o projeto:</p>
<p><strong>Tecnologia e Infraestrutura:</strong> O site antigo usava <a href="http://pt.wikipedia.org/wiki/Microsoft_SQL_Server" target="_blank">SQLServer</a> como banco de dados e tecnologia <a href="http://pt.wikipedia.org/wiki/ASP" target="_blank">ASP</a>. Como usamos Groovy e Grails, por trás temos uma JVM <a href="http://pt.wikipedia.org/wiki/Plataforma_Java">Java</a> em execução, e o banco de dados, o bom e velho <a href="http://pt.wikipedia.org/wiki/MySQL">MySQL</a>.</p>
<p>Antes, para suportar o ASP, o <a href="http://pt.wikipedia.org/wiki/IIS">IIS</a> era usado como web server, e agora Um <a href="http://pt.wikipedia.org/wiki/Servidor_Apache">apache</a> balanceia as requisições aos dois <a href="http://pt.wikipedia.org/wiki/Tomcat">Tomcats</a>. Tudo isto está deployado e rodando em um Cloud Server da Locaweb, por opção do cliente, onde já mantinha a conta antiga.</p>
<p><strong>Integração com o sistema legado:</strong> Para a integração do modelo de dados antigo e o novo modelo, construímos rotinas de importação dos dados usando <a href="http://docs.codehaus.org/display/GROOVY/Tutorial+6+-+Groovy+SQL" target="_blank">Groovy SQL</a>, uma maneira <span style="text-decoration: line-through;"> fácil, </span> muito fácil, de fazer rotinas em banco de dados.</p>
<p><strong>Plugins utilizados: </strong>Ahhh, os bons e velhos plugins do Grails, não canso de dizer que esta é a melhor parte do Grails! Foram usados os plugins:</p>
<p><a href="http://grails.org/plugin/mail" target="_blank"><strong>Grails-Mail</strong></a>, para envio dos e-mails e formas de contato do site<br />
<a href="http://grails.org/plugin/acegi" target="_blank"><strong>Grails-Acegi</strong></a>, para autenticação e segurança<br />
<a href="http://grails.org/plugin/cookie" target="_blank"><strong>Grails-Cookie</strong></a>, para manipulação dos cookies do cliente<br />
<a href="http://grails.org/plugin/navigation" target="_blank"><strong>Grails-Navigation</strong></a> para criação de menus/submenus da interface administrativa<br />
<a href="http://grails.org/plugin/richui" target="_blank"><strong>Grails-RichUi</strong></a> para alguns componentes gráficos como auto-complete e nuvem de tags<br />
<a href="http://grails.org/plugin/runtime-logging" target="_blank"><strong>Grails-RuntimeLogging</strong></a>, um ótimo plugin para moder trabalhar com o nível de log de cada artefato (controller, service, etc), da app em runtime<br />
<a href="http://grails.org/plugin/settings" target="_blank"><strong>Grails-Settings</strong></a> para algumas parametrizações da aplicação.</p>
<p>E com certeza, se eu tivesse pesquisado com um pouco mais de tempo, teria usado outros plugins para evitar algum trabalho que tenha feito na mão. E é claro, além disso, bastante (mesmo) <a href="http://www.jquery.com" target="_blank">jquery</a>, <a href="http://pt.wikipedia.org/wiki/AJAX_%28programa%C3%A7%C3%A3o%29" target="_blank">ajax</a> e <a href="http://pt.wikipedia.org/wiki/Json" target="_blank">json</a>.</p>
<p>É isso, qualquer dúvida sobre o projeto, como aconteceu, soluções e problemas, basta comentar!</p>
<p>Obrigado a todos!</p>

]]></content:encoded>
			<wfw:commentRss>http://lucastex.com.br/2010/01/10/portal-imobiliario-usando-groovy-e-grails/feed/</wfw:commentRss>
		<slash:comments>24</slash:comments>
		</item>
		<item>
		<title>Enviando emails com Spring e Velocity</title>
		<link>http://lucastex.com.br/2009/10/08/enviando-emails-com-spring-e-velocity/</link>
		<comments>http://lucastex.com.br/2009/10/08/enviando-emails-com-spring-e-velocity/#comments</comments>
		<pubDate>Thu, 08 Oct 2009 12:53:52 +0000</pubDate>
		<dc:creator>Lucas Teixeira</dc:creator>
				<category><![CDATA[Spring]]></category>
		<category><![CDATA[Velocity]]></category>
		<category><![CDATA[ioc]]></category>
		<category><![CDATA[mail]]></category>

		<guid isPermaLink="false">http://lucastex.com.br/?p=5</guid>
		<description><![CDATA[

Primeiro post do meu blog totalmente em português!
Esta semana, precisei adicionar na aplicação a funcionalidade de enviar e-mails usando templates do Velocity para o corpo do e-mail. Claro que o poderíamos usar o arroz com feijão do Velocity para isso, fazendo o merge do template com nosso contexto de variáveis, mas acabei esbarrando em um [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Flucastex.com.br%252F2009%252F10%252F08%252Fenviando-emails-com-spring-e-velocity%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Enviando%20emails%20com%20Spring%20e%20Velocity%22%20%7D);"></div>
<p>Primeiro post do meu blog totalmente em português!</p>
<p>Esta semana, precisei adicionar na aplicação a funcionalidade de enviar e-mails usando templates do <a href="http://velocity.apache.org/" target="_blank">Velocity</a> para o corpo do e-mail. Claro que o poderíamos usar o arroz com feijão do Velocity para isso, fazendo o merge do template com nosso contexto de variáveis, mas acabei esbarrando em um site, e descobri que o próprio <a href="http://www.springsource.org/" target="_blank">Spring</a> já possui um FactoryBean para a criação do meu VelocityEngine além de também ficar responsável com o carregamento dos templates (na minha opinião, a parte mais chata).</p>
<p>Bom, explicando brevemente como resolvi o problema:</p>
<ul>
<li>Bean <a href="http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/ui/velocity/VelocityEngineFactoryBean.html" target="_blank">VelocityEngineFactoryBean</a></li>
</ul>
<p>Defini este bean no applicationContext.xml para controlar a injeção do <a href="http://www.jdocs.com/velocity/1.5/org/apache/velocity/app/VelocityEngine.html" target="_blank">VelocityEngine</a></p>
<pre class="brush: xml;">&lt;bean id=&quot;velocityEngine&quot; class=&quot;org.springframework.ui.velocity.VelocityEngineFactoryBean&quot;&gt;
  &lt;property name=&quot;resourceLoaderPath&quot; value=&quot;/WEB-INF/templates/&quot; /&gt;
&lt;/bean&gt;</pre>
<p>Notem que a propriedade <strong>resourceLoaderPath </strong>já é definida ali, e é neste diretório indicado que os templates deverão estar.</p>
<ul>
<li>Bean <a href="http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/mail/javamail/JavaMailSender.html" target="_blank">JavaMailSenderImpl</a></li>
</ul>
<p>Este bean do core do spring já encapsula o envio da mensagem, neste exemplo, está configurado com estas propriedades que vieram de um arquivo de propriedades que carreguei no início do meu applicationContext.xml</p>
<pre class="brush: xml;">&lt;bean id=&quot;mailSender&quot; class=&quot;org.springframework.mail.javamail.JavaMailSenderImpl&quot;&gt;
  &lt;property name=&quot;host&quot; value=&quot;${mail.smtp.host}&quot; /&gt;
  &lt;property name=&quot;username&quot; value=&quot;${mail.smtp.user}&quot; /&gt;
  &lt;property name=&quot;password&quot; value=&quot;${mail.smtp.pass}&quot; /&gt;
  &lt;property name=&quot;port&quot; value=&quot;${mail.smtp.port}&quot; /&gt;
&lt;/bean&gt;</pre>
<ul>
<li>Bean <a href="http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/mail/SimpleMailMessage.html" target="_blank">SimpleMailMessage</a></li>
</ul>
<p>Este é o bean que será o template da mensagem. É um &#8220;modelo&#8221; de mensagem, que carrega o endereço &#8216;from&#8217; e também o subject do e-mail do mesmo arquivo de configuração.</p>
<pre class="brush: xml;">&lt;bean id=&quot;templateMailMessage&quot; class=&quot;org.springframework.mail.SimpleMailMessage&quot;&gt;
  &lt;property name=&quot;from&quot; value=&quot;${mail.from}&quot; /&gt;
  &lt;property name=&quot;subject&quot; value=&quot;${mail.subject}&quot; /&gt;
&lt;/bean&gt;</pre>
<p>Com isso, já tenho os 3 beans que serão injetados em meu componente de envio de e-mails.</p>
<ul>
<li>Template velocity do e-mail</li>
</ul>
<p>O template que eu criei para o teste é bem simples e segue abaixo. Se chama <strong>mail.vm</strong> e como dito ali em cima, está dentro de <strong>/WEB-INF/templates/</strong></p>
<pre class="brush: css;">Oi ${nome}, seu e-mail (${email}) foi cadastrado no sistema.</pre>
<ul>
<li>Componente final para o envio do e-mail</li>
</ul>
<p>Chamei o componente de MailComponent (bem criativo, né?), e a única coisa que ele faz, é receber os beans que definimos via injeção, criar uma nova mensagem usando o template de e-mails e setar como body da mensagem o resultado do merge entre o template e as minhas variáveis. Segue o código do componente.</p>
<pre class="brush: java;">import java.util.HashMap;
import java.util.Map;

import org.apache.velocity.app.VelocityEngine;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.MailSender;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.stereotype.Component;
import org.springframework.ui.velocity.VelocityEngineUtils;

@Component
public class MailComponent {

  @Autowired
  private MailSender mailSender;

  @Autowired
  private SimpleMailMessage templateMailMessage;

  @Autowired
  private VelocityEngine velocityEngine;

  public void sendMail(String template, Stirng nome, String email, String ... to) {

    Map&lt;String, Object&gt; ctx= new HashMap&lt;String, Object&gt;() {{
      put(&quot;nome&quot;, nome);
      put(&quot;email&quot;, email);
    }};

    String body = VelocityEngineUtils.mergeTemplateIntoString(velocityEngine, template, ctx);
    SimpleMailMessage msg = new SimpleMailMessage(this.templateMailMessage);
    msg.setTo(to);
    msg.setText(body);

    mailSender.send(msg);
  }
}</pre>
<p>Pronto, o componente está pronto, agora a qualquer momento, em qualquer classe (que tenha acesso ao contexto de DI do spring é claro) você poderá chamar o seu componente</p>
<pre class="brush: java;">@Autowired
private MailComponent mailComponent</pre>
<p>E enviar os e-mails aos usuários:</p>
<pre class="brush: java;">//Envia e-mail para o usuário com cópia ao admin
mailComponent.sendMail(&quot;mail.vm&quot;, &quot;Lucas&quot;, &quot;mail@mail.org&quot;, &quot;mail@mail.org&quot;, &quot;admin@site.org&quot;);</pre>
<p>É isso aí.</p>
<p>[]s,</p>
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 122px; width: 1px; height: 1px;">VelocityEngineFactoryBean</div>

]]></content:encoded>
			<wfw:commentRss>http://lucastex.com.br/2009/10/08/enviando-emails-com-spring-e-velocity/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
	</channel>
</rss>
