vraptor3: dúvida com injeção de dependências [RESOLVIDO]

2 respostas
hyr4x

Pessoal, estou com problemas em relação a Injeção de Dependência com o vraptor3. Na verdade eu nunca utilizei este recurso em lugar nenhum.

Minha arquitetura pode ser alterada sem problemas. No momento está da seguinte forma:

Existe um SessionFactoryProvider que fornece SessionFactory para SessionProvider. O SessionProvider fornece um objeto Session para o objeto SessionManager conforme ilustra as classes abaixo.

@Component
@ApplicationScoped
public class SessionFactoryProvider implements ComponentFactory<SessionFactory> {

	private final SessionFactory factory;

	public SessionFactoryProvider() {
		this.factory = new AnnotationConfiguration().configure().buildSessionFactory();
	}

	public SessionFactory getInstance() {
		return this.factory;
	}

}
@Component
@RequestScoped
public class SessionProvider implements ComponentFactory<Session> {

	private final SessionFactory factory;

	public SessionProvider(SessionFactory factory) {
		this.factory = factory;
	}

	public Session getInstance() {
		return this.factory.openSession();
	}

}
@Component
@RequestScoped
public class SessionManager {

	private Session session;

	public SessionManager(Session session) {
		this.session = session;
	}

	public Session getSession() {
		return this.session;
	}

	public Session getWithTransaction() {
		if (!this.session.getTransaction().isActive()) {
			this.session.getTransaction().begin();
		}

		return this.session;
	}

	public void commitTransaction() {
		if (this.session != null && this.session.isOpen() && this.session.getTransaction().isActive()) {
			this.session.getTransaction().commit();
		}
	}

	public void close() {
		if (this.session != null && this.session.isOpen()) {
			this.session.close();
		}
	}

	public void rollbackTransaction() {
		if (this.session != null && this.session.isOpen() && this.session.getTransaction().isActive()) {
			this.session.getTransaction().rollback();
		}
	}

}

Ok! O problema é que esse objeto SessionManager é injetado em um interceptor e no meu DAOFactory conforme as classes abaixo:

@Intercepts
@RequestScoped
public class JPAInterceptor implements Interceptor {

	private SessionManager sessionManager;

	public JPAInterceptor(SessionManager sessionManager) {
		this.sessionManager = sessionManager;
	}

	@Override
	public boolean accepts(ResourceMethod rm) {
		return true;
	}

	@Override
	public void intercept(InterceptorStack stack, ResourceMethod rm, Object obj) throws InterceptionException {
		try {
			stack.next(rm, obj);
			this.sessionManager.commitTransaction();
		} catch (RuntimeException e) {
			this.sessionManager.rollbackTransaction();
			e.printStackTrace();
			throw e;
		} finally {
			this.sessionManager.close();
		}
	}

}
@Component
public class DAOFactory {

	private SessionManager manager;

	public DAOFactory(SessionManager manager) {
		this.manager = manager;
	}

	public GenericDao<Cliente, Long> getClienteDao() {
		return new GenericDao<Cliente, Long>(Cliente.class, this.manager);
	}

}

E para meu controller é só preciso injetar meu DAOFactory. Da sequinte forma:

@Resource
public class ClienteController {

	private final DAOFactory daoFactory;
	private final Result result;

	public ClienteController(Result result, DAOFactory daoFactory) {
		this.result = result;
		this.daoFactory = daoFactory;
	}

}

Pois bem, ao executar a aplicação e tentar acessar o formulário do ClienteController ocorre o seguinte erro:

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'clienteController' defined in file [C:\eclipse\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps\controller\ClienteController.class]: Unsatisfied dependency expressed through constructor argument with index 1 of type [dao.DAOFactory]: : No unique bean of type [dao.DAOFactory] is defined: Unsatisfied dependency of type [class dao.DAOFactory]: expected at least 1 matching bean; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [dao.DAOFactory] is defined: Unsatisfied dependency of type [class dao.DAOFactory]: expected at least 1 matching bean
	at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:591)
	at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:193)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:925)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:835)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:440)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
	at java.security.AccessController.doPrivileged(Native Method)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380)
	at org.springframework.beans.factory.support.AbstractBeanFactory$2.getObject(AbstractBeanFactory.java:302)
	at org.springframework.web.context.request.AbstractRequestAttributesScope.get(AbstractRequestAttributesScope.java:43)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:308)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:297)
	at org.springframework.context.support.AbstractApplicationContext.getBeansOfType(AbstractApplicationContext.java:942)
	at org.springframework.beans.factory.BeanFactoryUtils.beansOfTypeIncludingAncestors(BeanFactoryUtils.java:224)
	at br.com.caelum.vraptor.ioc.spring.VRaptorApplicationContext.getBean(VRaptorApplicationContext.java:196)
	at br.com.caelum.vraptor.ioc.spring.SpringBasedContainer.instanceFor(SpringBasedContainer.java:56)
	at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:53)
	at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:51)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:71)
	at br.com.caelum.vraptor.interceptor.multipart.MultipartInterceptor.intercept(MultipartInterceptor.java:61)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:57)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:71)
	at br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:58)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:57)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:71)
	at br.com.caelum.vraptor.core.URLParameterExtractorInterceptor.intercept(URLParameterExtractorInterceptor.java:45)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:57)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:71)
	at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:70)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:57)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:71)
	at br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:71)
	at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:99)
	at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:38)
	at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:97)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
	at java.lang.Thread.run(Unknown Source)
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [dao.DAOFactory] is defined: Unsatisfied dependency of type [class dao.DAOFactory]: expected at least 1 matching bean
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:613)
	at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:622)
	at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:584)
	... 49 more

Se alguém puder me ajudar eu agradeço desde já! Lembrando que não tenho problemas em alterar a criação dessas classes. Fiquem a vontade.

Peço desculpas pelo post imenso!

Desde já agradeço.

2 Respostas

Lucas_Cavalcanti

qual foi a configuração que você colocou no web.xml:

<context-param>
        <param-name>br.com.caelum.vraptor.spring.packages</param-name>
        <param-value>o.que.vc.pos.aqui</param-value>
    </context-param>

todos os componentes que você for registrar pra fazer injeção de dependências têm que estar abaixo do pacote
que está nessa configuração.
e seu DaoFactory provavelmente está fora desse pacote base…

[]'s

hyr4x

Putz! Nunca iria descobrir!

Mais uma vez obrigado. Funcionou perfeitamente!

Criado 10 de setembro de 2009
Ultima resposta 10 de set. de 2009
Respostas 2
Participantes 2