Galera estou tentando criar um DAO Generico com o Spring 3 e hibernate, mas sem sucesso.
Gostaria da ajuda de vcs, alguem tem um exemplo de como criar um dao generico com Spring e hibernate?
Obrigado!
Galera estou tentando criar um DAO Generico com o Spring 3 e hibernate, mas sem sucesso.
Gostaria da ajuda de vcs, alguem tem um exemplo de como criar um dao generico com Spring e hibernate?
Obrigado!
Nesse post: http://www.guj.com.br/java/234011-forma-certa-de-construir-o-dao tem um exemplo de DAO Genérico que criei integrando Spring e Hibernate.
Valeu cara pela sua ajuda, tentei utilizar o seu exemplo na classe abaixo, mas ao rodar o projeto o erro abaixo é exibido.
import java.util.List;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
public class BaseDAO<T> extends HibernateDaoSupport {
public BaseDAO() {
}
public void salvar(T obj) {
getHibernateTemplate().saveOrUpdate(obj);
getHibernateTemplate().flush();
}
public void remover(Object obj) {
getHibernateTemplate().delete(obj);
getHibernateTemplate().flush();
}
@SuppressWarnings("unchecked")
public T buscar(Class<T> clazz, Long id) {
return (T) getHibernateTemplate().get(clazz, id);
}
@SuppressWarnings("unchecked")
public List<T> listar(Class<T> clazz) {
return (List<T>) getHibernateTemplate().find("from " + clazz.getName());
}
}
28/02/2011 17:57:05 org.apache.catalina.core.StandardContext listenerStart
SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'baseGFKDAO' defined in file [D:\MAK\Projetos\teste01\Fontes\Analisar\Netbeans\Analisar\build\web\WEB-INF\classes\br\com\mak\dao\BaseGFKDAO.class]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: 'sessionFactory' or 'hibernateTemplate' is required
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1420)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:580)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425)
at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:276)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:197)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:47)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3972)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4467)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:546)
at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:637)
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:521)
at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1359)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:297)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:836)
at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:761)
at org.apache.catalina.manager.ManagerServlet.check(ManagerServlet.java:1500)
at org.apache.catalina.manager.ManagerServlet.deploy(ManagerServlet.java:849)
at org.apache.catalina.manager.ManagerServlet.doGet(ManagerServlet.java:351)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
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.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:558)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
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:298)
at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:859)
at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:579)
at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1555)
at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.IllegalArgumentException: 'sessionFactory' or 'hibernateTemplate' is required
at org.springframework.orm.hibernate3.support.HibernateDaoSupport.checkDaoConfig(HibernateDaoSupport.java:118)
at org.springframework.dao.support.DaoSupport.afterPropertiesSet(DaoSupport.java:44)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1477)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1417)
... 45 more
28/02/2011 17:57:07 org.apache.catalina.core.ApplicationContext log
INFO: Closing Spring root WebApplicationContext
Mudei a classe passando um session no construtor, e aquele erro não aparece mais.
Só que agora tenho outro erro este não sei o que pode ser.
[code]
import java.util.List;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
public class BaseDAO extends HibernateDaoSupport {
private final Session session;
public BaseDAO(Session session) {
this.session = session;
}
public void salvar(T obj) {
getHibernateTemplate().saveOrUpdate(obj);
getHibernateTemplate().flush();
}
public void remover(Object obj) {
getHibernateTemplate().delete(obj);
getHibernateTemplate().flush();
}
@SuppressWarnings("unchecked")
public T buscar(Class<T> clazz, Long id) {
return (T) getHibernateTemplate().get(clazz, id);
}
@SuppressWarnings("unchecked")
public List<T> listar(Class<T> clazz) {
return (List<T>) getHibernateTemplate().find("from " + clazz.getName());
}
}[/code]
28/02/2011 18:26:48 org.springframework.web.context.ContextLoader initWebApplicationContext
SEVERE: Context initialization failed
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'baseGFKDAO' defined in file [D:\MAK\Projetos\teste01\Fontes\Analisar\Netbeans\Analisar\build\web\WEB-INF\classes\br\com\mak\dao\BaseGFKDAO.class]: Unsatisfied dependency expressed through constructor argument with index 0 of type [org.hibernate.Session]: : No matching bean of type [org.hibernate.Session] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [org.hibernate.Session] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:730)
at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:196)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1003)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:907)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:485)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:580)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425)
at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:276)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:197)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:47)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3972)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4467)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:546)
at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:637)
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:521)
at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1359)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:297)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:836)
at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:761)
at org.apache.catalina.manager.ManagerServlet.check(ManagerServlet.java:1500)
at org.apache.catalina.manager.ManagerServlet.deploy(ManagerServlet.java:849)
at org.apache.catalina.manager.ManagerServlet.doGet(ManagerServlet.java:351)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
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.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:558)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
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:298)
at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:859)
at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:579)
at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1555)
at java.lang.Thread.run(Thread.java:619)
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [org.hibernate.Session] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}
at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:920)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:789)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:703)
at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:795)
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:723)
... 48 more
28/02/2011 18:26:48 com.sun.faces.config.ConfigureListener contextInitialized
INFO: Inicializando Mojarra 2.0.2 (FCS b10) para o contexto '/Analisar'
28/02/2011 18:26:50 org.apache.catalina.core.StandardContext start
SEVERE: Error listenerStart
28/02/2011 18:26:50 org.apache.catalina.core.StandardContext start
SEVERE: Context [/Analisar] startup failed due to previous errors
28/02/2011 18:26:50 org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc
SEVERE: A web application registered the JBDC driver [com.mysql.jdbc.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
28/02/2011 18:26:50 org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc
SEVERE: A web application registered the JBDC driver [oracle.jdbc.driver.OracleDriver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
É que vc tem que injetar a session. Me manda msg privada, depois posto no forum a estrutura do projeto.
Seguinte, dentro da WEB-INF crie os seguintes arquivos:
database.properties -> Onde você vai colocar as configurações de conexão com o banco de dados
jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@//127.0.0.1:1521/XE
jdbc.username=SYSTEM
jdbc.password=admin
DataSource.xml -> Spring usará para injetar a conexão
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location">
<value>WEB-INF/database.properties</value>
</property>
</bean>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
</beans>
HibernateSessionFactory -> Configurações do Hibernate, aqui a sessão é injetada
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
<property name="annotatedClasses">
<list>
<value>com.teste.struts.model.Pessoa</value>
</list>
</property>
</bean>
</beans>
MainBean.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jee="http://www.springframework.org/schema/jee"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.0.xsd">
<bean id="pessoaAction" class="com.teste.struts.action.PessoaAction">
<property name="pessoaService" ref="pessoaService" />
</bean>
<bean id="pessoaService" class="com.teste.struts.service.PessoaService">
<property name="daoGenerico" ref="daoGenerico" />
</bean>
<bean id="daoGenerico" class="com.teste.struts.dao.GenericDao">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
</beans>
SpringBeans.xml -> relativo ao applicationContext
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<!-- Database Configuration -->
<import resource="DataSource.xml"/>
<import resource="HibernateSessionFactory.xml"/>
<!-- Beans Declaration -->
<import resource="MainBean.xml"/>
</beans>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>teste-struts</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- Struts 2 -->
<filter>
<filter-name>struts</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- Spring -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/SpringBeans.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
</web-app>
Pronto, essas são as configurações básicas necessárias, usei em meu projeto Oracle + Hibernate + Spring + Struts + Apache Tomcat + Eclipse
Testa aí e manda o feedback!
Valeu pela ajuda Emmanuel, cara as suas configurações deram certo aqui, tenho mais algumas duvidas.
Ao criar um novo DAO e extender do GenericDao que crie, terei que adicionar este novo DAO no xml de configuração injetando o sessionfactory?
Exemplo
<bean id="NovoDAO" class="br.com.mka.dao.NovoDAO">
<!-- Injeta o hibernateTemplate na classe DAO -->
<property name="sessionFactory" ref="sessionFactory" />
</bean>
Pois aqui exigiu que eu coloca-se todos os daos novos no xml, tem alguma maneira de não precisar?
Outra duvida, depois de criar meus daos e extender eles do GenericDao, ao tentar utiliza-los em uma classe passando eles pelo construtor como a classe abaixo.
@ManagedBean
public class ImportarControle {
private BaseGFKDAO baseGfkDao;
private BaseScanDAO baseScanDao;
private VolumeMercadoDAO volDao;
// @Autowired
// public ImportarControle() {
// }
@Autowired
public ImportarControle(BaseGFKDAO baseGfkDao, BaseScanDAO baseScanDao, VolumeMercadoDAO volDao) {
this.baseGfkDao = baseGfkDao;
this.baseScanDao = baseScanDao;
this.volDao = volDao;
}
O seguinte erro é gerado, sabe me dizer o que estou fazendo de errado?
01/03/2011 13:54:57 com.sun.faces.mgbean.BeanManager preProcessBean
SEVERE: O JSF estará indisponível para criar o bean gerenciado importarControle quando ele for solicitado. Os seguintes problemas foram encontrados:
- A classe de bean gerenciado br.com.mka.web.controle.ImportarControle para o bean gerenciado importarControle não declara um construtor no-argument público.
01/03/2011 13:54:57 com.sun.faces.lifecycle.ApplyRequestValuesPhase execute
WARNING: Não foi possível criar o bean gerenciado importarControle. Os seguintes problemas foram encontrados:
- A classe de bean gerenciado br.com.mka.web.controle.ImportarControle para o bean gerenciado importarControle não declara um construtor no-argument público.
com.sun.faces.mgbean.ManagedBeanCreationException: Não foi possível criar o bean gerenciado importarControle. Os seguintes problemas foram encontrados:
- A classe de bean gerenciado br.com.mka.web.controle.ImportarControle para o bean gerenciado importarControle não declara um construtor no-argument público.
at com.sun.faces.mgbean.BeanManager.create(BeanManager.java:263)
at com.sun.faces.el.ManagedBeanELResolver.getValue(ManagedBeanELResolver.java:86)
javax.faces.FacesException: Não foi possível criar o bean gerenciado importarControle. Os seguintes problemas foram encontrados:
at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:54)
- A classe de bean gerenciado br.com.mka.web.controle.ImportarControle para o bean gerenciado importarControle não declara um construtor no-argument público.
at com.sun.faces.el.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:72)
at com.sun.faces.lifecycle.ApplyRequestValuesPhase.execute(ApplyRequestValuesPhase.java:86)
at org.apache.el.parser.AstIdentifier.getValue(AstIdentifier.java:68)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at org.apache.el.parser.AstValue.getTarget(AstValue.java:68)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
at org.apache.el.parser.AstValue.invoke(AstValue.java:187)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:312)
at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:98)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.primefaces.component.fileupload.FileUpload.broadcast(FileUpload.java:238)
at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:77)
at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:740)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at javax.faces.component.UIViewRoot.processDecodes(UIViewRoot.java:943)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at com.sun.faces.lifecycle.ApplyRequestValuesPhase.execute(ApplyRequestValuesPhase.java:78)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:312)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:77)
at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:859)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:579)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1555)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at java.lang.Thread.run(Thread.java:619)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
Caused by: com.sun.faces.mgbean.ManagedBeanCreationException: Não foi possível criar o bean gerenciado importarControle. Os seguintes problemas foram encontrados:
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
- A classe de bean gerenciado br.com.mka.web.controle.ImportarControle para o bean gerenciado importarControle não declara um construtor no-argument público.
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at com.sun.faces.mgbean.BeanManager.create(BeanManager.java:263)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at com.sun.faces.el.ManagedBeanELResolver.getValue(ManagedBeanELResolver.java:86)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:54)
at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:859)
at com.sun.faces.el.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:72)
at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:579)
at org.apache.el.parser.AstIdentifier.getValue(AstIdentifier.java:68)
at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1555)
at org.apache.el.parser.AstValue.getTarget(AstValue.java:68)
at java.lang.Thread.run(Thread.java:619)
at org.apache.el.parser.AstValue.invoke(AstValue.java:187)
Quando eu uso Anotação do Spring eu não configuro nada no xml do spring, pois ele auto detecta.
Eu tive um problema com o Spring que ele não conseguia injetar as classes pelo construtor ai eu criei getrs and setrs e um construtor vazio, e adicionei a anotação @Autowired no atributo e não mais no construtor e tudo funcionou, n sei c é o seu caso, mais antes crie um construtor vazio(sem parâmetros) para todas as suas classes que o spring estiver gerenciando,
Já que vc esta preocurando sobre o dao generico com hibernate dá uma olhada neste link abaixo sobre como utilizar um filtro generico com o hibernate, para min é muito util pode ser para vc tb… http://www.guj.com.br/java/221618-filter-dinamico-para-hibernate
Eu tentei colocar Anotation mas parece que ele não pega, pois se eu tirar os daos do xml dá erro
Classe Dao estendendo da Genérica.
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package br.com.rkam.dao;
import br.com.rkam.modelo.BaseGFK;
import org.springframework.stereotype.Repository;
/**
*
* @author shakall
*/
@Repository
public class BaseGFKDAO extends BaseGenericDAO<BaseGFK> {
}
BaseGenericaDAO
package br.com.rkam.dao;
import br.com.rkam.modelo.BaseModel;
import java.util.List;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.stereotype.Repository;
@Repository
public class BaseGenericDAO<T extends BaseModel> extends HibernateDaoSupport {
public void salvar(T obj) {
getHibernateTemplate().saveOrUpdate(obj);
getHibernateTemplate().flush();
}
public void remover(Object obj) {
getHibernateTemplate().delete(obj);
getHibernateTemplate().flush();
}
@SuppressWarnings("unchecked")
public T buscar(Class<T> clazz, Long id) {
return (T) getHibernateTemplate().get(clazz, id);
}
@SuppressWarnings("unchecked")
public List<T> listar(Class<T> clazz) {
return (List<T>) getHibernateTemplate().find("from " + clazz.getName());
}
}
é que para ativar o 'auto detecta precisa configurar no xml do spring(spring-configured, component-scan … ), eu recomendo depois vc estudar pois evita de ficar escrevendo muitas linhas no arquivo xml do spring
Bom para ñ, sair muito da sua duvida principal mantenha as linhas do seu xml, como tava e tenta apenas trocar a anotação @Autowired para o field e não mais no contrutor e depois cria o construtor vazio da classe br.com.mka.web.controle.ImportarControle… era ai que tava dando erro!
Cara fiz da forma que vc disse, tirei o construtor, não deu mais o erro, mas os daos estão null, ou seja não foram carregados.
Na linha 99 faço o teste para ver se ele foi carregado mas sem sucesso, está null e nenhuma exceção foi gerada!
package br.com.mka.web.controle;
import br.com.mka.dao.BaseGFKDAO;
import br.com.mka.dao.BaseScanDAO;
import br.com.mka.dao.VolumeMercadoDAO;
import br.com.mka.enumeration.ImportarTabelas;
import br.com.mka.modelo.BaseGFK;
import br.com.mka.modelo.BaseScan;
import br.com.mka.modelo.VolumeMercado;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.context.FacesContext;
import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;
import org.primefaces.model.UploadedFile;
import org.springframework.beans.factory.annotation.Autowired;
@ManagedBean
public class ImportarControle {
private UploadedFile file;
private StreamedContent stream;
@Autowired
private BaseGFKDAO baseGfkDao = null;
@Autowired
private BaseScanDAO baseScanDao = null;
@Autowired
private VolumeMercadoDAO volDao = null;
public ImportarControle() {
}
public BaseGFKDAO getBaseGfkDao() {
return baseGfkDao;
}
@Autowired
public void setBaseGfkDao(BaseGFKDAO baseGfkDao) {
this.baseGfkDao = baseGfkDao;
}
public BaseScanDAO getBaseScanDao() {
return baseScanDao;
}
@Autowired
public void setBaseScanDao(BaseScanDAO baseScanDao) {
this.baseScanDao = baseScanDao;
}
public VolumeMercadoDAO getVolDao() {
return volDao;
}
@Autowired
public void setVolDao(VolumeMercadoDAO volDao) {
this.volDao = volDao;
}
// @Autowired
// public ImportarControle(BaseGFKDAO baseGfkDao, BaseScanDAO baseScanDao, VolumeMercadoDAO volDao) {
// this.baseGfkDao = baseGfkDao;
// this.baseScanDao = baseScanDao;
// this.volDao = volDao;
// }
public UploadedFile getFile() {
return file;
}
public void setFile(UploadedFile file) {
this.file = file;
}
public void upload() {
System.out.println("Upload: ");
FacesMessage msg = new FacesMessage("Succesful", file.getFileName() + " is uploaded.");
FacesContext.getCurrentInstance().addMessage(null, msg);
}
public void handleFileUpload(FileUploadEvent event) {
try {
stream = new DefaultStreamedContent(event.getFile().getInputstream());
byte[] vet = event.getFile().getContents();
String endereco = "C:/temp" + System.currentTimeMillis() + ".csv";
FileOutputStream out = new FileOutputStream(endereco);
out.write(vet);
out.close();
System.out.println("Listando Volume");
if (volDao != null) {
List<VolumeMercado> lista = volDao.listar(VolumeMercado.class);
if (lista != null) {
System.out.println("Total de VOL:" + lista.size());
} else {
System.out.print("Lista null");
}
} else {
System.out.println("Dao null");
}
//importar(endereco, event.getComponent().getId());
} catch (IOException ex) {
ex.getMessage();
}
}
public void setStream(StreamedContent stream) {
this.stream = stream;
}
public StreamedContent getStream() {
return stream;
}
}
Ué Cacilda, claro que os DAOs vão estar nulos, você não injetou a instancia do DAO genérico nas propriedades da classe ImportarControle. Faz um casting e injeta. Lembre-se o cérebro do Spring está no xml, o que você descrever lá ele vai fazer.
Acho que não estou conseguindo injetar pois meu spring não está reconhecendo anotation, ai teria que fazer via xml a injeção, segue abaixo o meu spring.xml onde está toda a configuração do projeto, não sei o que pode estar errado pois configurei tudo que estou utilizando nele.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
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-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
<!-- habilita a configuração por annotations -->
<context:annotation-config />
<!-- define os pacotes/subpacotes que onde serão procurados beans do spring -->
<context:component-scan base-package="br.com.mka" />
<!-- Parâmetros de conexão com o banco de dados -->
<bean id="dataSource" class="br.com.mka.config.Conexao" />
<!-- Propriedades do hibernate -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean" >
<property name="dataSource" ref="dataSource" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
<property name="annotatedClasses">
<list>
<value>br.com.mka.modelo.Usuario</value>
<value>br.com.mka.modelo.BaseGFK</value>
<value>br.com.mka.modelo.BaseScan</value>
<value>br.com.mka.modelo.CategoriaUnidade</value>
<value>br.com.mka.modelo.VolumeMercado</value>
<value>br.com.mka.modelo.VolumeMercadoUnidade</value>
</list>
</property>
</bean>
<!-- Injeta uma sessão do hibernate -->
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="baseGenericDAO" class="br.com.mka.dao.BaseGenericDAO">
<!-- Injeta o hibernateTemplate na classe DAO -->
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="baseGFKDAO" class="br.com.mka.dao.BaseGFKDAO">
<!-- Injeta o hibernateTemplate na classe DAO -->
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="baseScanDAO" class="br.com.mka.dao.BaseScanDAO">
<!-- Injeta o hibernateTemplate na classe DAO -->
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="categoriaUnidadeDAO" class="br.com.mka.dao.CategoriaUnidadeDAO">
<!-- Injeta o hibernateTemplate na classe DAO -->
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="usuarioDAO" class="br.com.mka.dao.UsuarioDAO">
<!-- Injeta o hibernateTemplate na classe DAO -->
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="volumeMercadoDAO" class="br.com.mka.dao.VolumeMercadoDAO">
<!-- Injeta o hibernateTemplate na classe DAO -->
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="volumeMercadoUnidadeDAO" class="br.com.mka.dao.VolumeMercadoUnidadeDAO">
<!-- Injeta o hibernateTemplate na classe DAO -->
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- View scope -->
<bean class="org.springframework.beans.factory.config.CustomScopeConfigurer">
<property name="scopes">
<map>
<entry key="view">
<bean class="br.com.mka.web.util.ViewScope"/>
</entry>
</map>
</property>
</bean>
</beans>
Os meus Daos já estende do DAO generico, não entendi o que tenho que fazer para funcionar, os daos estão na classe e todos estão marcados com autowire, o que mais tenho que fazer para ir?
Acima enviei meu spring.xml
Cara colocando na mão vai, os daos foram carregados, mas soh se eu colocar na mão, não se porque ele não ta pegando as annotations.
Segue o xml as linhas 75 a 79 injetam os daos.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
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-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
<!-- habilita a configuração por annotations -->
<context:annotation-config />
<!-- define os pacotes/subpacotes que onde serão procurados beans do spring -->
<context:component-scan base-package="br.com.mka" />
<!-- Parâmetros de conexão com o banco de dados -->
<bean id="dataSource" class="br.com.mka.config.Conexao" />
<!-- Propriedades do hibernate -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean" >
<property name="dataSource" ref="dataSource" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
<property name="annotatedClasses">
<list>
<value>br.com.mka.modelo.Usuario</value>
<value>br.com.mka.modelo.BaseGFK</value>
<value>br.com.mka.modelo.BaseScan</value>
<value>br.com.mka.modelo.CategoriaUnidade</value>
<value>br.com.mka.modelo.VolumeMercado</value>
<value>br.com.mka.modelo.VolumeMercadoUnidade</value>
</list>
</property>
</bean>
<!-- Injeta uma sessão do hibernate -->
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="baseGenericDAO" class="br.com.mka.dao.BaseGenericDAO">
<!-- Injeta o hibernateTemplate na classe DAO -->
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="baseGFKDAO" class="br.com.mka.dao.BaseGFKDAO">
<!-- Injeta o hibernateTemplate na classe DAO -->
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="baseScanDAO" class="br.com.mka.dao.BaseScanDAO">
<!-- Injeta o hibernateTemplate na classe DAO -->
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="categoriaUnidadeDAO" class="br.com.mka.dao.CategoriaUnidadeDAO">
<!-- Injeta o hibernateTemplate na classe DAO -->
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="usuarioDAO" class="br.com.mka.dao.UsuarioDAO">
<!-- Injeta o hibernateTemplate na classe DAO -->
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="volumeMercadoDAO" class="br.com.mka.dao.VolumeMercadoDAO">
<!-- Injeta o hibernateTemplate na classe DAO -->
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="volumeMercadoUnidadeDAO" class="br.com.mka.dao.VolumeMercadoUnidadeDAO">
<!-- Injeta o hibernateTemplate na classe DAO -->
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="importarControle" class="br.com.mka.web.controle.ImportarControle">
<!-- Injeta o hibernateTemplate na classe DAO -->
<property name="baseGfkDao" ref="baseGFKDAO" />
<property name="baseScanDao" ref="baseScanDAO" />
<property name="volDao" ref="volumeMercadoDAO" />
</bean>
<!-- View scope -->
<bean class="org.springframework.beans.factory.config.CustomScopeConfigurer">
<property name="scopes">
<map>
<entry key="view">
<bean class="br.com.mka.web.util.ViewScope"/>
</entry>
</map>
</property>
</bean>
</beans>
Pra habilitar as anotações eu uso assim:
<bean
class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor" />
<bean
class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
Bom no meu xml esta assim para configurar o spring anotation:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="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 ">
<context:component-scan base-package="br.com.meu.pacote.para.o.spring.scanear.control"/>
<context:component-scan base-package="br.com.meu.pacote.para.o.spring.scanear.model" />
<context:component-scan base-package="br.com.meu.pacote.para.o.spring.scanear.view" />
<context:annotation-config />
<context:spring-configured/>
Outra coisa eu adiciono o @Autowide no atributo e não no método, mais achu q o spring é suficientemente inteligente e deve enteder. Para usar anotação vc tem que configurar o spring pois no padrão dele as anotações vem desativadas…
Consegui fazer funcionar com annotation, mas eu fiz o inverso que vc eu coloquei @Autowire apenas nos sets e não nos atributos e foi de boa, agora os daos eu tive que deixar no xml, por annotation não foi, unico que eu consegui configurar por annotation foi o controler.
Nas suas classes daos vc precisa colocar a anotação @Repository do Spring para ele saber que deve gerenciar tal classe dai vc pode remover do xml…
Talvez vc tb precise configurar tb quais pacotes o spring deve scanear… é o seguinte comando:
<context:component-scan base-package="br.com.meu.pacote.para.o.spring.scanear.dao" />