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:
@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.
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
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?
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.
[quote=Shakall]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![/quote]
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.
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: [/quote]
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!
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
[quote=Priuli]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.[/quote]
Então cara eu estava salvando um objeto usando o getHibernateTemplate().save(obj); e surgiu este erro, tirando o filtro funciona normal!