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.import java.util.List;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
public class BaseDAO<T> 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());
}
}
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" />
Então o scan do spring tá para todos os meus pacotes, coloquei ele a um nivel acima então pega tudo.
o meu DAOGeneric coloquei a tag @Repository, e tirei do xml, blz deu certo não gerou nenhum erro.
<!-- 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" />
Agora as classes que eu crio e estendo da minha DAOGeneric, eu preciso colocar no xml, pois se eu tirar e colocar apenas a tag @Repository, gera um exception dizendo que eu preciso injetar um sessionFactory ou um hibernateTemplate.
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'baseGFKDAO' defined in file [D:\MKA\Projetos\teste01\Fontes\Netbeans\Analise\build\web\WEB-INF\classes\br\com\mka\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
vc tem que informar ao spring onde esta o session factory para ele injetar para vc nos seus @Repository…
no meu arquivo xml eu configuro o hibernate e pego o sessionFactory nos meus daos com anotarion @Repository esta assim:
Arquivo de configuração do spring…
<!-- Pool de conexao dataSource via jndi -->
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>java:MeuDS</value>
</property>
</bean>
<!-- hibernate session factory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource">
<ref local="dataSource" />
</property>
<property name="annotatedClasses">
<list>
<value>br.com.entity.Usuario</value>
<value>br.com.entity.Permissao</value>
...
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.connection.autocommit">false</prop>
<prop key="hibernate.current_session_context_class">thread</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
</bean>
nas minhas classes dao fica ± assim:
@Repository("usuarioDAO")
public class HibernateUsuarioDAOImp extends AbstractGenericDAO<Usuario> implements UsuarioDAO{
@Autowired
public HibernateUsuarioDAOImp(SessionFactory sessionFactory) {
super(Usuario.class,sessionFactory);
super.hibernateTemplate = new HibernateTemplate(sessionFactory);
}
....
O meu xml e dao estão iguais ao teu mas não vai, cara estou tendo uma experiência muito ruim com o spring, serio to desanimando, agora alem de dar estes erros de ele as vezes pegar annotation outras não, o hibernate não está fechando as sessões deixando todas aberta.
Uma duvida, vi que com os DAOS estentendo do HibernateDaoSupport posso utilizar tanto session quanto hibernateTemplate, qual é o recomendado para se utilizar com spring?
Estou acostumado a utilizar o session, pois até hoje utilizei o hibernate sozinho, é a primeira vez que estou utilizando o spring, e como de costume estou usando o session mas estou percebendo que as sessões estão sendo deixadas abertas.
Seria melhor usar o template?
Valeu!
Sim… vc deve usar o hibernateTemplate, eu tive problemas de sessão usando o session do hibernate. Ele funciona perfeito apenas com o hibernateTemplate, com ele vc consegue obter a sessao tb, mais ele faz tudo que o session faz.
O Spring tem muita coisa pra configurar + depois de configurado vale muito apena, na minha opiniao…
apanhei bastante pra configurar, fora que tô usando transação do spring por anotattion que é muito bom, porem é osso configurar pela primeira vez, depois vc pega o geito…
Sobre as sessões abertas, vc tem que ver c não tá com o problema do OpenSessionInView, o Spring tem um filter para fechar a sessão na hora certa c vc ñ usar vai dar problema mesmo, principalemente se a sessão estiver por request(Thread).
Exemplo:
Eu to usando com jsf… vc precisaria adicionar o opensessioninview no web.xml
<filter>
<filter-name>openSessionInViewFilter</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>openSessionInViewFilter</filter-name>
<url-pattern>*.jsf</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>openSessionInViewFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
Sobre injeção de depencencia por annotações, a unica coisa que sofri, eu ñ consegui arrumar, foi que em classes com anotação @Component eu ñ conseguir injeter as classes de anotação @Service pelo construtor, só consegui via método set… ñ consegui entender… porem o resto funciona perfeito… neste caso como disse eu removi o @Autowide do construtor e coloquei nos atributos…
Uma duvida neste filter que vc passou, vc está usando *.jsp e *.jsf no url-pattern, no meu caso as sessões estão ficando abertas por eu utilizar o session dentro de um dato, utilizado por um controller, nesta url-pattern deverei colocar a classe que faz o uso para ele verificar? Ou deixa como está mesmo?
Valeu pelas dicas e ajudas!
Cara deu certo aqui o filter como vc passou, agora não preciso mais ficar fechando a sessão, uma duvida, no session posso colocar sql direto quando necessario, e não utilizar apenas hql, minha duvida é no hibernateTemplate, tem como executar sql sem ser pegando uma session? pois mexendo aqui tudo nele envolve hql, criando criteria e tal.
Valeu!
Cara deu certo aqui o filter como vc passou, agora não preciso mais ficar fechando a sessão, uma duvida, no session posso colocar sql direto quando necessario, e não utilizar apenas hql, minha duvida é no hibernateTemplate, tem como executar sql sem ser pegando uma session? pois mexendo aqui tudo nele envolve hql, criando criteria e tal.Valeu!
Sim, é possivel usar sql ou hql, eu faço assim, eu obtenho a sessao do hibernate e faço por ele:
hibernateTemplate.executeFind(new HibernateCallback(){
public Object doInHibernate(Session session) throws HibernateException{
SQLQuery sql = session.createSQLQuery("select * from minha_tabela");
return sql.list();
}
}
Cara uma duvida depois que coloquei o filtro agora ele cuida de fechar a session mas quando tento salvar um objeto agora dá a seguinte exception
org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition.
at org.springframework.orm.hibernate3.HibernateTemplate.checkWriteOperationAllowed(HibernateTemplate.java:1175)
at org.springframework.orm.hibernate3.HibernateTemplate$12.doInHibernate(HibernateTemplate.java:685)
at org.springframework.orm.hibernate3.HibernateTemplate$12.doInHibernate(HibernateTemplate.java:1)
at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:406)
at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
at org.springframework.orm.hibernate3.HibernateTemplate.save(HibernateTemplate.java:683)
at br.com.dao.BaseGenericDAO.salvar(BaseGenericDAO.java:12)
at br.com.web.controle.ImportarControle.importar(ImportarControle.java:276)
at br.com.web.controle.ImportarControle.handleFileUpload(ImportarControle.java:171)
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.el.parser.AstValue.invoke(AstValue.java:191)
at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276)
at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:98)
at org.primefaces.component.fileupload.FileUpload.broadcast(FileUpload.java:238)
at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:740)
at javax.faces.component.UIViewRoot.processDecodes(UIViewRoot.java:943)
at com.sun.faces.lifecycle.ApplyRequestValuesPhase.execute(ApplyRequestValuesPhase.java:78)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:312)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:77)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
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: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)
Vc configurou ou ta usando transação ?
parece que q esta marcando como readOnly a sua query isso faz com q o banco apenas aceite queries de select e não de atualização.
Ou intão vc tá usando um método de select para executar uma query de update…
vc teria que usar query.executeUpdate()
se tiver usando query.executeQuery() esta errado.
Acho interessante citar que usar o @Autowired direto no atributo é uma péssima prática. Fazendo isso, não é possível testar unitariamente, já que não há como injetar a dependência.
Flw! :thumbup:
Acho interessante citar que usar o @Autowired direto no atributo é uma péssima prática. Fazendo isso, não é possível testar unitariamente, já que não há como injetar a dependência.
Flw! :thumbup:
Concordo, ao meu ver visualmente fica mais facil de ver a anotação no atributo do que no metodo, porem o correto ao meu ver é no construtor e depois no metodo (para usar os sets), porem não afeta nada nos testes de unidade se afetar seu teste tá errado, justamente pois ñ deve ter o contexto do spring atuando em testes unitários, a dependência deve ser injetada via sets!! Bem frizado!
Costumo injetar diretamente no atributo apenas quando faço um teste de integração, no caso, injetando o bean diretamente na classe de teste, o que nesse caso não vai ter impacto algum. Salvo essa exceção, procuro injetar apenas pelo construtor, pois assim garanto que a classe é instanciada com todas as dependências! 
Flw! :thumbup:
@Repository
public class HibernateGenericDao implements Dao {
private final HibernateTemplate template;
@Autowired
public HibernateGenericDao(HibernateTemplate hibernateTemplate) {
this.template = hibernateTemplate;
}
public <T> T find(Class<T> classe, Serializable id) {
return template.get(classe, id);
}
public <T> T find(final T entity) {
return template.findByExample(t);
}
public <T> List<T> findAll(Class<T> classe) {
return template.loadAll(classe);
}
public <T> void merge(T entity) {
template.saveOrUpdate(entity);
}
public <T> void persist(T entity) {
template.save(entity);
}
public <T> void remove(T entity) {
template.delete(entity);
}
}
Já que esta usando hibernate, segue meu projeto para minimizar a criação de queries especificas nas consultas realizadas pelas classes Daos, usando um projeto de filtro generico para consultas sql
Aqui tem um exemplo de dao, porem diferente do von.juliano eu utilizo herança
http://www.guj.com.br/java/221618-filter-dinamico-para-hibernate
Vc configurou ou ta usando transação ?
parece que q esta marcando como readOnly a sua query isso faz com q o banco apenas aceite queries de select e não de atualização.Ou intão vc tá usando um método de select para executar uma query de update…
vc teria que usarquery.executeUpdate()
se tiver usandoquery.executeQuery()esta errado.
Então cara eu estava salvando um objeto usando o getHibernateTemplate().save(obj); e surgiu este erro, tirando o filtro funciona normal!