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.