<?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>Fabio Brandão - Blog &#187; Java</title>
	<atom:link href="http://www.fnbrandao.com.br/blog/category/programacao/java-programacao/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.fnbrandao.com.br/blog</link>
	<description></description>
	<lastBuildDate>Tue, 24 Aug 2010 01:33:22 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Selenium + Wait for Ajax</title>
		<link>http://www.fnbrandao.com.br/blog/2010/04/selenium-wait-for-ajax/</link>
		<comments>http://www.fnbrandao.com.br/blog/2010/04/selenium-wait-for-ajax/#comments</comments>
		<pubDate>Tue, 20 Apr 2010 18:56:56 +0000</pubDate>
		<dc:creator>fabio</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Selenium]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[waitforcondition]]></category>

		<guid isPermaLink="false">http://www.fnbrandao.com.br/blog/?p=61</guid>
		<description><![CDATA[Hoje tive que fazer um teste automatizado que deveria obrigatoriamente esperar por um Ajax ser executado para continuar a sua execução.
Encontrei este link: http://agilesoftwaretesting.com/?p=111, que fala o seguinte:
Faça um método em java como:
 
public static void waitForAjax(Selenium selenium, String timeout) {
    String js_condition =
      "selenium.browserbot.getCurrentWindow().jQuery.active == 0";
 [...]]]></description>
			<content:encoded><![CDATA[<p>Hoje tive que fazer um teste automatizado que deveria obrigatoriamente esperar por um Ajax ser executado para continuar a sua execução.</p>
<p>Encontrei este link: <a title="http://agilesoftwaretesting.com/?p=111" href="http://agilesoftwaretesting.com/?p=111" target="_blank">http://agilesoftwaretesting.com/?p=111</a>, que fala o seguinte:</p>
<p>Faça um método em java como:</p>
<p><code> </code></p>
<pre>public static void waitForAjax(Selenium selenium, String timeout) {
    String js_condition =
      "selenium.browserbot.getCurrentWindow().jQuery.active == 0";
    selenium.waitForCondition(js_condition, timeout);
}
</pre>
<p>O valor da variável js_condition dependerá do framework JS que está sendo utilizado no site. Basicamente ele segue o seguinte formato:</p>
<p><code>"selenium.browserbot.getCurrentWindow()." + library specific string + " == 0"</code></p>
<p>Onde a parte específica pode ser:</p>
<p><code>jQuery: "jQuery.active"<br />
Prototype: "Ajax.activeRequestCount"<br />
Dojo: "dojo.io.XMLHTTPTransport.inFlight.length"</code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.fnbrandao.com.br/blog/2010/04/selenium-wait-for-ajax/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Novo Site do PagSeguro</title>
		<link>http://www.fnbrandao.com.br/blog/2009/11/novo-site-do-pagseguro/</link>
		<comments>http://www.fnbrandao.com.br/blog/2009/11/novo-site-do-pagseguro/#comments</comments>
		<pubDate>Sun, 01 Nov 2009 14:30:27 +0000</pubDate>
		<dc:creator>fabio</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Vida]]></category>
		<category><![CDATA[PagSeguro]]></category>
		<category><![CDATA[UOL]]></category>

		<guid isPermaLink="false">http://www.fnbrandao.com.br/blog/2009/11/novo-site-do-pagseguro/</guid>
		<description><![CDATA[O novo site do PagSeguro não foi apenas uma melhoria no código antigo, foi muito mais que isso. O novo site do PagSeguro foi a reescrita completa de um enorme sistema que estava em produção.
A entrada em produção começou no dia 30/10/2009 no início da noite, onde o sistema antigo foi alterado para não permitir [...]]]></description>
			<content:encoded><![CDATA[<p>O novo site do PagSeguro não foi apenas uma melhoria no código antigo, foi muito mais que isso. O novo site do PagSeguro foi a reescrita completa de um enorme sistema que estava em produção.</p>
<p>A entrada em produção começou no dia 30/10/2009 no início da noite, onde o sistema antigo foi alterado para não permitir a utilização do saldo nem o login dos usuários. Após um certo tempo, a migração de dados do sistema antigo para o sistema novo foi iniciada. Essa parte deve ter demorado em torno de 10 horas. Após isto, o novo sistema foi liberado para o pessoal que estava dentro do UOL para a homologação. Foram encontrados alguns problemas (nada sério, ex.: tela de consulta do CEP no cadastro não estava funcionando) que foram corrigidos de forma fácil e rápido. Após essa homologação o sistema foi liberado para os usuários no dia 01/11/2009 às 01:11:11.</p>
<p>Essa reescrita de sistema envolveu desde uma remodelagem completa do banco de dados (também foi trocado de SQLServer para Oracle), troca de linguagem de programação (.Net para Java), e duas coisas críticas: troca de conceitos e de regras de negócio.</p>
<p>A troca de conceitos deve-se ao novo jeito que as transações são vistas no sistema. Antes, cada movimentação de dinheiro (ou movimentação financeira) era feita através de uma nova transação. No novo PagSeguro cada intenção de compra, adição de fundos, etc, cria apenas uma transação, sendo que esta transação pode possuir diversas movimentações financeiras associadas.</p>
<p>Outra mudança grande é a maneira como o saldo é &#8220;calculado&#8221;. Antes, o sistema recalculava o saldo do usuário à partir dos status das transações. Este jeito era extremamente lento. O novo sistema consolida o saldo do usuário, sendo que sempre que é necessário saber o saldo não é necessário fazer cálculos. Essa é a mesma abordagem utilizada por diversos bancos.</p>
<p>Basicamente, esse projeto (na visão de desenvolvimento) durou aproximadamente 1 ano e 9 meses. Durante esse tempo todo tivemos que resolver diversos problemas, tivemos diversas brigas, diversas alegrias e diversas discussões.</p>
<p>Apesar de tudo: obrigado a todas as pessoas que ajudaram de alguma forma com este projeto e boa sorte pra todos nós!</p>
<p>Agora só falta a cervejada para comemorar!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fnbrandao.com.br/blog/2009/11/novo-site-do-pagseguro/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>As coisas estúpidas feitas quando se trabalha com programação</title>
		<link>http://www.fnbrandao.com.br/blog/2009/09/as-coisas-estupidas-feitas-quando-se-trabalha-com-programacao/</link>
		<comments>http://www.fnbrandao.com.br/blog/2009/09/as-coisas-estupidas-feitas-quando-se-trabalha-com-programacao/#comments</comments>
		<pubDate>Wed, 23 Sep 2009 13:35:04 +0000</pubDate>
		<dc:creator>fabio</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Java EE]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[erros]]></category>
		<category><![CDATA[estupidez]]></category>

		<guid isPermaLink="false">http://www.fnbrandao.com.br/blog/?p=37</guid>
		<description><![CDATA[Este post foi traduzido e alterado deste link:
http://blog.cherouvim.com/the-stupidest-things-ive-done-in-my-programming-job/
Observação: Não fui eu quem escreveu este post. Apenas fiz a tradução e alteração pois achei muito interessante.
As coisas estúpidas feitas quando se trabalho com programação

ORM

Estupidez
Construir um framework próprio de ORM.
Consequências
O projeto vira uma bagunça depois de 2 anos de manutenção com gambiarras para passar pelo meu framework [...]]]></description>
			<content:encoded><![CDATA[<p>Este post foi traduzido e alterado deste link:<br />
<a href="http://blog.cherouvim.com/the-stupidest-things-ive-done-in-my-programming-job/" target="_blank">http://blog.cherouvim.com/the-stupidest-things-ive-done-in-my-programming-job/</a></p>
<p>Observação: Não fui eu quem escreveu este post. Apenas fiz a tradução e alteração pois achei muito interessante.</p>
<p>As coisas estúpidas feitas quando se trabalho com programação</p>
<ol>
<li><a href="http://en.wikipedia.org/wiki/Object-relational_mapping" target="_blank">ORM</a>
<ul>
<li>Estupidez<br />
Construir um framework próprio de ORM.</li>
<li>Consequências<br />
O projeto vira uma bagunça depois de 2 anos de manutenção com gambiarras para passar pelo meu framework ORM desenvolvido e chamar comandos SQL&#8217;s customizados.</li>
<li>O que deveria ter sido feito?<br />
Usar <a href="https://www.hibernate.org/" target="_blank">hibernate</a>, <a href="http://ibatis.apache.org/" target="_blank">iBATIS</a>, <a href="http://cayenne.apache.org/" target="_blank">Cayenne</a> ou outros parecidos.</li>
</ul>
</li>
<li><a href="http://en.wikipedia.org/wiki/Entity-attribute-value_model" target="_blank">EAV</a>
<ul>
<li>Estupidez<br />
Usar uma modelagem de banco de dados do tipo Entity-Attribute-Value model.</li>
<li>Consequências<br />
Solução não escalável e impossibilidade de rodar queries úteis no banco de dados.</li>
<li>O que deveria ter sido feito?<br />
Usar uma modelagem de banco de dados normalizada.</li>
</ul>
</li>
<li>Acesso ao Banco de dados
<ul>
<li>Estupidez<br />
Sincronizar o acesso ao banco de dados com uma conexão compartilhada.</li>
<li>Consequências<br />
Escalabilidade zero. Tempos de respostas muito lentos quando mais de 10 usuários estavam utilizando a aplicação.</li>
<li>O que deveria ter sido feito?<br />
Não fazer isto e utilizar um <a href="http://en.wikipedia.org/wiki/Connection_pool" target="_blank">pool de conexões</a> como <a href="http://sourceforge.net/projects/c3p0/" target="_blank">c3p0</a> e usar uma &#8220;nova&#8221; (reutilizada) conexão retornada do pool para cada ciclo de request / response.</li>
</ul>
</li>
<li><a href="http://en.wikipedia.org/wiki/Integrated_development_environment" target="_blank">IDE</a>
<ul>
<li>Estupidez<br />
Evitar aprender e utilizar uma IDE.</li>
<li>Consequências<br />
Falta de habilidade de compilar, testar e fazer o deploy da aplicação rapidamente e / ou geralmente fazer qualquer coisa útil.</li>
<li>O que deveria ter sido feito?<br />
Familiarizar-me com uma IDE. Ex.: <a href="http://www.netbeans.org/" target="_blank">NetBeans</a>, <a href="http://www.eclipse.org/" target="_blank">eclipse</a>, etc.</li>
</ul>
</li>
<li><a href="http://en.wikipedia.org/wiki/Database_transaction" target="_blank">Transações</a>
<ul>
<li>Estupidez<br />
Não usá-las.</li>
<li>Consequências<br />
Corromper os dados da aplicação.</li>
<li>O que deveria ter sido feito?<br />
Usar transações do banco de dados. No <a href="http://www.mysql.com/" target="_blank">MySQL</a> usar <a href="http://en.wikipedia.org/wiki/Innodb" target="_blank">InnoDB</a>.</li>
</ul>
</li>
<li><a href="http://en.wikipedia.org/wiki/Prepared_statements#Parameterized_statements" target="_blank">Prepared Statements</a>
<ul>
<li>Estupidez<br />
Usar Statements, concatenação de strings e escapar caracteres para montar queries &#8220;seguras&#8221;.</li>
<li>Consequências<br />
Possibilidade de <a href="http://en.wikipedia.org/wiki/Sql_injection" target="_blank">SQL Injections</a> na aplicação. É possível logar utilizando por exemplo &#8220;or 1=1;delete from users;&#8221; e alterar o estado do banco de dados de uma forma muito desagradável.</li>
<li>O que deveria ter sido feito?<br />
Usar Prepared Statements que montam e escapam corretamente as queries dependendo do driver JDBC utilizado.</li>
</ul>
</li>
<li>Lógica de Negócios
<ul>
<li>Estupidez<br />
Fazer isto nos templates (<a href="http://en.wikipedia.org/wiki/JavaServer_Pages" target="_blank">JSP</a>).</li>
<li>Consequências<br />
Aplicação de manutenção difícil.</li>
<li>O que deveria ter sido feito?<br />
Fazer isto utilizando o padrão <a href="http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller" target="_blank">MVC</a> com servlets ou com um Front Controller. Melhor se utilizar um framework MVC open source como <a href="http://struts.apache.org/" target="_blank">Struts</a>, <a href="http://www.springsource.org/" target="_blank">Spring MVC</a>, etc.</li>
</ul>
</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.fnbrandao.com.br/blog/2009/09/as-coisas-estupidas-feitas-quando-se-trabalha-com-programacao/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PDB Extractor</title>
		<link>http://www.fnbrandao.com.br/blog/2008/12/pdb-extractor/</link>
		<comments>http://www.fnbrandao.com.br/blog/2008/12/pdb-extractor/#comments</comments>
		<pubDate>Sun, 14 Dec 2008 17:48:46 +0000</pubDate>
		<dc:creator>fabio</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[pdb extractor]]></category>

		<guid isPermaLink="false">http://www.fnbrandao.com.br/blog/?p=26</guid>
		<description><![CDATA[Ainda em relação ao post anterior, tive que extrair o conteúdo de um arquivo PDB (um formato de arquivo usado nos Palm&#8217;s).
Encontrei a solução parcial neste post:http://www.neowin.net/forum/index.php?s=d21af43a292e783de98d0644c0824b70&#38;showtopic=689476&#38;pid=590047756&#38;st=0&#38;#entry590047756
A solução descrita não funcionou, mas após algumas alterações na solução, serviu para o que eu precisava:
/***
* T3_allfiles
* based upon T3_APR.java from Shadowmite's forum
*
* This file will extract a [...]]]></description>
			<content:encoded><![CDATA[<p>Ainda em relação ao post anterior, tive que extrair o conteúdo de um arquivo PDB (um formato de arquivo usado nos Palm&#8217;s).</p>
<p>Encontrei a solução parcial neste post:<a href="http://www.neowin.net/forum/index.php?s=d21af43a292e783de98d0644c0824b70&amp;showtopic=689476&amp;pid=590047756&amp;st=0&amp;#entry590047756" target="_blank">http://www.neowin.net/forum/index.php?s=d21af43a292e783de98d0644c0824b70&amp;showtopic=689476&amp;pid=590047756&amp;st=0&amp;#entry590047756</a></p>
<p>A solução descrita não funcionou, mas após algumas alterações na solução, serviu para o que eu precisava:</p>
<p><code>/***<br />
* T3_allfiles<br />
* based upon T3_APR.java from Shadowmite's forum<br />
*<br />
* This file will extract a binary file from it's<br />
* Palm PDB prison.  Just drop this in the directory<br />
* that contains the *.pdb files, and run it.  It'll<br />
* get them all.  Well, mostly.  See next.<br />
*<br />
* This file is NOT made to extract the rom image.<br />
* Use Grack's RomTool for that.<br />
*/</code></p>
<p>import java.io.*;</p>
<p>public class T3_allfiles {</p>
<p>public static void main(String[] args) throws Exception {<br />
File directory = new File(&#8220;/home/fabio/Desktop/pdb/&#8221;);<br />
String[] files = directory.list(new PDBfilter());</p>
<p>for (String individualFile : files) {<br />
pdb2(&#8220;/home/fabio/Desktop/pdb/&#8221; + individualFile);<br />
}<br />
}</p>
<p>static void pdb2(String file) throws Exception {<br />
System.out.println(file);<br />
RandomAccessFile in = new RandomAccessFile(file, &#8220;r&#8221;);<br />
in.skipBytes(76);<br />
int numRec = in.readShort();<br />
int[] toc = new int[numRec];<br />
for (int i = 0; i &lt; numRec; ++i) {<br />
toc[i] = in.readInt();<br />
in.readInt();<br />
}<br />
for (int i = 0; i &lt; numRec; ++i) {<br />
in.seek(toc[i]);<br />
short fileNameSize = in.readShort();<br />
byte[] fn = new byte[fileNameSize];<br />
in.read(fn);</p>
<p>String fileName = new String(fn);<br />
System.out.println(&#8220;\t&#8221; + fileName);</p>
<p>String[] directories = fileName.split(&#8220;\\/&#8221;);<br />
String directory = &#8220;.&#8221;;<br />
for (int j = 0; j &lt; directories.length &#8211; 1; j++) {<br />
directory += File.separator + directories[j];<br />
}<br />
new File(directory).mkdirs();</p>
<p>BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(fileName));</p>
<p>if (i &lt; toc.length &#8211; 2) {<br />
int bytesToRead = toc[i + 1] &#8211; toc[i] &#8211; fileNameSize &#8211; 2;<br />
while (bytesToRead &gt; 0) {<br />
out.write(in.read());<br />
bytesToRead&#8211;;<br />
}<br />
} else {<br />
int b;<br />
while ((b = in.read()) &gt; -1) {<br />
out.write(b);<br />
}<br />
}</p>
<p>out.close();<br />
}<br />
}<br />
}</p>
<p>class PDBfilter implements FilenameFilter {<br />
public boolean accept(File dir, String name) {<br />
if (new File(dir, name).isDirectory()) {<br />
return false;<br />
}</p>
<p>name = name.toLowerCase();<br />
return name.endsWith(&#8220;.pdb&#8221;);<br />
}<br />
}</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fnbrandao.com.br/blog/2008/12/pdb-extractor/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Descompilando Java</title>
		<link>http://www.fnbrandao.com.br/blog/2008/12/descompilando-java/</link>
		<comments>http://www.fnbrandao.com.br/blog/2008/12/descompilando-java/#comments</comments>
		<pubDate>Sun, 14 Dec 2008 17:44:00 +0000</pubDate>
		<dc:creator>fabio</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[descompilador]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[jd]]></category>
		<category><![CDATA[jd-gui]]></category>

		<guid isPermaLink="false">http://www.fnbrandao.com.br/blog/?p=25</guid>
		<description><![CDATA[Há algum tempo atrás, peguei um serviço pra fazer no qual o cliente não tinha o código fonte do sistema.
Após alguns dias procurando um descompilador java, achei este:
JD-Gui
Este descompilador é muito bom, devido à diversas features, como por exemplo, poder descompilar um jar inteiro, fazer links entre os arquivos descompilados, etc.
]]></description>
			<content:encoded><![CDATA[<p>Há algum tempo atrás, peguei um serviço pra fazer no qual o cliente não tinha o código fonte do sistema.</p>
<p>Após alguns dias procurando um descompilador java, achei este:</p>
<p><a href="http://java.decompiler.free.fr/" target="_blank">JD-Gui</a></p>
<p>Este descompilador é muito bom, devido à diversas features, como por exemplo, poder descompilar um jar inteiro, fazer links entre os arquivos descompilados, etc.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fnbrandao.com.br/blog/2008/12/descompilando-java/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Selenium &#8211; Permission denied to get property Location.href</title>
		<link>http://www.fnbrandao.com.br/blog/2008/07/selenium-permission-denied-to-get-property-locationhref/</link>
		<comments>http://www.fnbrandao.com.br/blog/2008/07/selenium-permission-denied-to-get-property-locationhref/#comments</comments>
		<pubDate>Wed, 23 Jul 2008 13:35:09 +0000</pubDate>
		<dc:creator>fabio</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Selenium]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[Location.href]]></category>

		<guid isPermaLink="false">http://www.fnbrandao.com.br/blog/?p=22</guid>
		<description><![CDATA[Hoje tive um problema no Selenium, no qual o mesmo não conseguia verificar a url do navegador, jogando uma exceção com a seguinte mensagem:
Permission denied to get property Location.href
Procurando no google, encontrei o seguinte blog:
http://www.woloszyn.org/2008/04/22/selenium-and-the-permission-denied-to-get-property-locationhref-problem/
Este blog mencionava que o problema era causado por um redirect enviado pelo response do servidor. A solução desse blog foi [...]]]></description>
			<content:encoded><![CDATA[<p>Hoje tive um problema no Selenium, no qual o mesmo não conseguia verificar a url do navegador, jogando uma exceção com a seguinte mensagem:</p>
<p><code>Permission denied to get property Location.href</code></p>
<p>Procurando no google, encontrei o seguinte blog:</p>
<p><a href="http://www.woloszyn.org/2008/04/22/selenium-and-the-permission-denied-to-get-property-locationhref-problem/" target="_blank">http://www.woloszyn.org/2008/04/22/selenium-and-the-permission-denied-to-get-property-locationhref-problem/</a></p>
<p>Este blog mencionava que o problema era causado por um redirect enviado pelo response do servidor. A solução desse blog foi não utilizar o redirect.</p>
<p>Em outro site:</p>
<p><a href="http://www.nabble.com/Permission-denied-to-get-property-Location.href-td8081383.html" target="_blank">http://www.nabble.com/Permission-denied-to-get-property-Location.href-td8081383.html</a></p>
<p>Falava que só bastava utilizar o *chrome ou *iehta (no meu código estava sendo utilizado o *firefox). Após esta alteração, tudo voltou a funcionar normalmente.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fnbrandao.com.br/blog/2008/07/selenium-permission-denied-to-get-property-locationhref/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Spring gerenciando as transações</title>
		<link>http://www.fnbrandao.com.br/blog/2008/06/spring-gerenciando-as-transacoes/</link>
		<comments>http://www.fnbrandao.com.br/blog/2008/06/spring-gerenciando-as-transacoes/#comments</comments>
		<pubDate>Fri, 06 Jun 2008 12:47:02 +0000</pubDate>
		<dc:creator>fabio</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[spring]]></category>

		<guid isPermaLink="false">http://www.fnbrandao.com.br/blog/?p=13</guid>
		<description><![CDATA[Após duas longas semanas resolvi o problema que estava tendo com o Spring gerenciando as transações de banco de dados. O que acontecia é que nenhuma transação era aberta na classe marcada com a anotação “@Transactional”. Segue abaixo um exemplo de como utilizar o gerenciamento de transações do Spring:

package br.com.test;

public interface IService {

   [...]]]></description>
			<content:encoded><![CDATA[<p>Após duas longas semanas resolvi o problema que estava tendo com o Spring gerenciando as transações de banco de dados. O que acontecia é que nenhuma transação era aberta na classe marcada com a anotação <i>“@Transactional”</i>. Segue abaixo um exemplo de como utilizar o gerenciamento de transações do Spring:</p>
<p><code>
<pre>package br.com.test;

public interface IService {

    int myServiceMethod(String myServiceParameter);

}</pre>
<p></code></p>
<p>Segue abaixo a implementação, repare no uso da anotação <i>“@Transactional”</i> na classe (isto indica que a classe toda deve estar associada à um contexto transacional. É possível também marcar métodos:</p>
<p><code>
<pre>package br.com.test;

import org.springframework.transaction.annotation.Transactional;

@Transactional
public class ServiceBean implements IService {

    public int myServiceMethod(String myServiceParameter) {
        return Integer.parseInt(myServiceParameter);
    }

}</pre>
<p></code></p>
<p>Agora só falta configurar o <i>“applicationContext.xml”</i> do Spring:</p>
<p><code>
<pre>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;beans xmlns="http://www.springframework.org/schema/beans"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:aop="http://www.springframework.org/schema/aop"
     xmlns:tx="http://www.springframework.org/schema/tx"
     xsi:schemaLocation="
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
     http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"&gt;

  &lt;bean id="myService" class="br.com.test.ServiceBean"/&gt;

  &lt;tx:annotation-driven transaction-manager="txManager"/&gt;

  &lt;bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"&gt;
    &lt;property name="dataSource" ref="dataSource"/&gt;
  &lt;/bean&gt;

  &lt;bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"&gt;
    &lt;property name="driverClassName" value="${jdbc.driverClassName}" /&gt;
    &lt;property name="url" value="${jdbc.url}" /&gt;
    &lt;property name="username" value="${jdbc.username}" /&gt;
    &lt;property name="password" value="${jdbc.password}" /&gt;
  &lt;/bean&gt;
&lt;/beans&gt;</pre>
<p></code></p>
<p>Repare no uso da tag <i>“&lt;tx:annotation-driven transaction-manager=&#8221;txManager&#8221;/&gt;”</i>. Esta tag ativa a configuração de transações baseada em anotações.</p>
<p>Até aí é muito simples utilizar o gerenciamento de transações do Spring. O problema que tive foi o seguinte: meu serviço possuía uma interface, e esta interface estava sendo implementada por uma classe abstrata. Essa classe abstrata definia o método que eu queria que fosse transacional. Depois eu criei uma terceira classe que extendia essa classe abstrata. Coloquei a anotação <i>“@Transactional”</i> na classe concreta, e o Spring não gerenciava as transações no método definido na classe abstrata. Para resolver o problema só foi necessário colocar a anotação da classe abstrata.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fnbrandao.com.br/blog/2008/06/spring-gerenciando-as-transacoes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
