Spring + Transações + Tratamento de exceptions

1 resposta
B

Bom dia pessoal, estou com dificuldade para obter uma exception a partir de um DAO que faz herança da classe JpaDaoSupport do Spring.

Minha aplicação está dividida em 3 camadas:
Serviço > BO > DAO

O método getPessoaFisicas no BO:

public class PessoaFisicaBOImpl implements PessoaFisicaBO {



public List getPessoaFisicas(int batchSize, int firstItem) {

return pessoaFisicaDao.find(select r from PessoaFisica r);  		

}



}
O método find na camada DAO:

public class PessoaFisicaDaoImpl extends JpaDaoSupport implements PessoaFisicaDao {



public List find(String queryString, Objectvalues) {

try {

return getJpaTemplate().find(queryString);

}catch(Exception e) {

throw new PersistenciaException(Camada de Persistencia. Error ao processar., e);

}

}



}

Quando o servidor de aplicação perde a conexão com o banco de dados, eu gostaria de pegar a exception no DAO e re-lançar novamente, e isso não acontece, porque o Spring faz o controle de transação, ou seja, antes de executar o método find do DAO ele lança a exception e essa exception vai para a camada BO, eu gostaria de saber como faço para primeiro essa exception seja tratada no DAO, para depois passar ao BO e re-lançar como PersistenciaException(…), ou seja, essa exception vai chegar no BO como PersistenciaException.

Desde já agradeço pela atenção.

Configuração do spring:

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="servirPU" />
</bean>
<tx:advice id="managerTxAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="*" propagation="REQUIRED" />
    </tx:attributes>
</tx:advice>
<aop:config>
    <aop:pointcut id="managerMethods" 
        expression="execution(* meudominio.modulo.cadastro.pessoafisica.dao.*Dao*.* (..))" />
    <aop:advisor advice-ref="managerTxAdvice" pointcut-ref="managerMethods" />
</aop:config>



<!-- ********************** -->
<!-- Injeção de Dependência -->
<!-- ********************** -->

<!-- PessoaFisica - [SERVICO > BO > DAO]  -->
<bean id="pessoaFisicaDao" class="meudominio.modulo.cadastro.pessoafisica.dao.impl.PessoaFisicaDaoImpl">
  <property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>

<bean id="pessoaFisicaBO" class="meudominio.modulo.cadastro.pessoafisica.bo.impl.PessoaFisicaBOImpl">
    <property name="pessoaFisicaDao" ref="pessoaFisicaDao"/>
</bean>

<bean id="pessoaFisicaServico" class="meudominio.modulo.cadastro.pessoafisica.servico.impl.PessoaFisicaServicoImpl">
    <property name="pessoaFisicaBO" ref="pessoaFisicaBO"/>
</bean>

1 Resposta

B

Solucionei esse problema criando uma aspecto:

Spring:

<!-- Aspecto do tratamento de exception a nivel de DAO -->
<aop:config>
	<aop:aspect ref="persistenciaException">
    	<aop:pointcut id="controlePersistenciaException" 
    		expression="execution(* *..dao.impl.*DaoImpl.*(..))" />
    	<aop:around pointcut-ref="controlePersistenciaException" method="checkPersistenciaException" />
    </aop:aspect>
</aop:config>    

<!-- Aspecto Tratamento de trasações nos DAO's -->
<aop:config>
    <aop:pointcut id="managerMethods" 
        expression="execution(* *..dao.impl.*DaoImpl.*(..))" />
    <aop:advisor pointcut-ref="managerMethods" advice-ref="managerTxAdvice" />
</aop:config>
PersistenciaExceptionAspecto.java

public class PersistenciaExceptionAspecto {

public Object checkPersistenciaException(ProceedingJoinPoint call) throws Throwable

{

System.out.println(Aspecto - Processando - Inicio);

Object o = null;

try {

o = call.proceed();

}catch(Exception e) {

System.out.println(Aspecto: PersistenciaExceptionAspecto - Lançada exception);

throw new PersistenciaException(Camada de Persistencia. Error ao processar., e);

}

System.out.println(Aspecto - Processando - Fim);

return o;

}

}
Criado 5 de setembro de 2007
Ultima resposta 10 de set. de 2007
Respostas 1
Participantes 1