VRaptor 3 + Transação

16 respostas
R

Ola!

Tenho usado o VRaptor no meu projeto e agora surgiu uma duvida e gostaria de melhorar ate a arquitetura…

Tenho usado:
JSP - VIEW
Controller = @Resource
Service ou Business = @Component

Até ai blz, uso o cotroller e faco as logicas nas classes de Service, e injeto o service no controller pelo construtor.

Até ai tudo gerenciado pelo VRaptor…

porem meus dao´s sao gerenciados pelo spring, criei uma Factory static aonde o spring injeta todos os dao´s, ai qdo eu preciso no service pego ele de forma statica, por ex:

public UsuarioService() {
		this.usuarioDAO = DAOFactory.getUsuarioDAO();
	}

ja que a classe de servico nao é gerenciada pelo spring nao consigo injetar o dao no service, entao fiz dessa forma.

esse é um problema… o outro é que eu nao consigo usar @Transactional nos meus servicos pelo mesmo motivo.

Teria algum modo melhor de fazer isso?

Obrigado

16 Respostas

Lucas_Cavalcanti

pq vc não conseguiu receber o UsuarioDAO no construtor do seu UsuarioService?

R

entao os meus controller e os services sao gerenciados pelo vraptor

agora os dao´s sao pelo spring, defino eles no appContext.xml, uso o jpaTemplate nos meus dao´s do spring

se tento inserir um @Component no dao e tento injetar pelo VRaptor no service, acontece algo assim

Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name

por isso eu injeto todos dao´s numa classe estatica tb gerenciada pelo spring e do service eu pego o dao como falei no post de cima

manjo?

R

Entao

Nao consigo anotar um metodo do meu service com @Transactional do spring, para gerenciamento das transacoes…

ja que o service é gerenciado pelo vraptor

Lucas_Cavalcanti

usar um componente definido no Spring dentro de um componente definido no VRaptor deveria funcionar: por exemplo receber o Dao no construtor do Controller…

onde você está colocando o applicationContext.xml?

R

no src/main/resources

se eu defino o bean no appContext

tenho q anotar esse bean com @Component?

ja tentei e nao vai

Lucas_Cavalcanti

não precisa anotar

o arquivo se chama:

applicationContext.xml

?

habilita o log de debug do VRaptor e dá uma olhada se ele fala que tá usando esse applicationContext.xml ou se tá criando um novo… ou posta o log aqui, plz

R

Sim o arquivo se chama: applicationContext.xml

log4j:WARN No appenders could be found for logger (org.springframework.context.support.ClassPathXmlApplicationContext).

se eu definir um bean de DAO no meu appContext como eu faco pra injetalo ele num controller, so por exemplo.

isso q eu nao to conseguindo fazer…

da excessao de q o spring na consegue satisfazer as dependencias

Lucas_Cavalcanti

cria um arquivo chamado log4j.xml na sua pasta src/main/resources com esse conteudo:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
        
        <appender name="stdout" class="org.apache.log4j.ConsoleAppender">
                <layout class="org.apache.log4j.PatternLayout">
                        <param name="ConversionPattern" 
                                value="%d{HH:mm:ss,SSS} %5p [%-20c{1}] %m%n"/>
                </layout>
        </appender>

        <category name="org.vraptor">
                <priority value="INFO" />
                <appender-ref ref="stdout" />
        </category>

        <category name="com.thoughtworks">
                <priority value="INFO" />
                <appender-ref ref="stdout" />
        </category>
                
        <category name="br.com.caelum.vraptor">
                <priority value="DEBUG" />
                <appender-ref ref="stdout" />
        </category>
        
        <category name="org.springframework">
                <priority value="INFO" />
                <appender-ref ref="stdout" />
        </category>
 
</log4j:configuration>
Lucas_Cavalcanti

deveria ser só receber no construtor… por isso q eu acho que o vraptor não tá carregando o seu applicationContext

R

Lucas,

Eu tenho ctz que o appContext ta sendo carregado, pq os meus dao´s estao definidos la.

se eu no meu service fizer isso:

public UsuarioService() {  
     this.usuarioDAO = DAOFactory.getUsuarioDAO();  
}

consigo ter acesso ao DAO, se o appContext nao tivesse sendo carregado o spring nao injeteria as classes de gerenciamento do JPA no meus dao´s

vo montar um projeto de teste aqui, como Dynamic Web Project mesmo e subo pra exemplificar

R

Fiz o seguinte teste e funcionou… vou testar na minha app pra ver se vai…

package br.com.integration.controller;

import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Resource;
import br.com.integration.service.UsuarioService;

@Resource
public class UsuarioController {

	private UsuarioService usuarioService;
	
	public UsuarioController(UsuarioService usuarioService) {
		this.usuarioService = usuarioService;
	}
	
	@Get
	@Path("/")
	public void exibir() {
		usuarioService.executarLogicaNegocioChamandoDAO();
	}
	
}
package br.com.integration.service;

import br.com.caelum.vraptor.ioc.Component;
import br.com.integration.dao.UsuarioDAO;

@Component
public class UsuarioService {

	private UsuarioDAO usuarioDAO;
	
	public UsuarioService(UsuarioDAO usuarioDAO) {
		this.usuarioDAO = usuarioDAO;
	}
	
	/**
	 * Executa alguma regra de negócio fazendo acesso ao DAO
	 */
	public void executarLogicaNegocioChamandoDAO() {		
		usuarioDAO.executarAlgoDeDAO();
	}
	
}
package br.com.integration.dao;

public interface UsuarioDAO {

	void executarAlgoDeDAO();
	
}
package br.com.integration.dao.impl;

import br.com.caelum.vraptor.ioc.Component;
import br.com.integration.dao.UsuarioDAO;

@Component
public class UsuarioDAOImpl implements  UsuarioDAO {

	//Constructor Method
	public UsuarioDAOImpl() {
	}

	public void executarAlgoDeDAO() {
		System.out.println("Executando método do DAO!");
	}
	
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:sec="http://www.springframework.org/schema/security"
       xmlns="http://www.springframework.org/schema/beans" xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:jee="http://www.springframework.org/schema/jee"
       xmlns:jms="http://www.springframework.org/schema/jms"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
       http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms-2.5.xsd
       http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd
       http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"
       default-autowire="byName">

   
    <!-- DAO -->
    <bean id="usuarioDAO" class="br.com.integration.dao.impl.UsuarioDAOImpl"/>
    <!-- DAO -->
    
</beans>

Espero que funcione na app real…

abs

Lucas_Cavalcanti

sim, deveria funcionar mesmo…

R

Funcionou tudo!

Eu havia feito de alguma forma q nao funcionou, feito coisa errada rs

vlw

R

Lucas,

Uma coisa que eu percebi é que so consigo injetar por contrutor, por setter nao é possivel…

procede?

Lucas_Cavalcanti

pra injetar pelo setter vc precisa anotar o setter com @Autowired (do spring)

R

Funcionou, mas tive que adicionar esta dependencia:

<dependency>
<groupId>aspectj</groupId>
     <artifactId>aspectjtools</artifactId>
     <version>1.5.3</version>
</dependency>

tava dando um noClassDefFoundError…

Criado 28 de julho de 2010
Ultima resposta 29 de jul. de 2010
Respostas 16
Participantes 2