Como utilizar OpenSessionInViewFilter  XML
Índice dos Fóruns » Desenvolvimento Web
Autor Mensagem
Insônia
Debugger
[Avatar]

Membro desde: 24/03/2005 23:06:33
Mensagens: 73
Offline

Olá,
estou utilizando os seguintes frameworks em um projeto web:

- Spring 1.2.6
- Hibernate 3.1
- JSF 1.1
- TomCat 5.5
- Java 5

Eu tentei configurar o filtro OpenSessionInViewFilter para acessar meus TOs em meus Managed Beans (JSF) utilizando lazy-load, mas eu devo ter cometido algum equivoco, pois quando tento acessar, vejo o famoso erro:



Acredito que eu devo ter cometido algum engano na configuração do filtro. Vejam como eu configurei meus arquivos xml:




Acredito que nao preciso incluir todos os meus arquivos XML, visto que eles sao apenas mapeamentos de meus beans. Vou dar prioridade para o s relacionados a persistencia:

hibernateProperties.xml (fragmento)



daoContext.xml (fragmento)



transactionContext.xml



enfim, serviceContext.xml (fragmento)



Meus DAOs todos herdam de HibernateDaoSupport e utilizam getHibernateTemplate().


Acredito que eu deva ter feito alguma configuracao errada no Filtro. Quando eu executo o codigo abaixo no meu Managed bean, ocorre o erro:



O log da aplicacao eh:



Percebi que quando eu carrego a pagina, aparece no log a mensagem:



e, quando a pagina é carregada, aparece tbm:



Porem, quando eu clico no <h:commandButtom> para que ele invoque a action do meu managed bean (veja log acima), o filtro aparentemente nao é invocado.

O que será que está errado na minha configuracao? Alguem consegue ver onde eu me equivoquei?

Agradeco qquer ajuda.

SCJP, SCWCD
Insônia
Debugger
[Avatar]

Membro desde: 24/03/2005 23:06:33
Mensagens: 73
Offline

+ informacoes:

Retirei os outros filtros que existiam - Ajax4jsf e ExtensionsFilter (myFaces) e o erro continua ocorrendo.

Perceba que o log informa que o transactionManager fecha a conexao assim que o services finaliza sua execucao:



Será que é por isso que no managed bean o erro ocorre? Por estarem na mesma requisicao, a conexao nao deveria continuar aberta e ser fechada pelo filtro apenas no final da mesma?

Já pesquisei bastante na web, e encontrei outros desenvolvedores com problemas por existirem 2 contextos com sessoes e sessionFactories diferentes... mas isso ocorria no Struts, e eu estou usando JSF.

Tenho certeza que estou cometendo algum equívoco, mas nao sei onde


Obrigado

SCJP, SCWCD
marcelo_mococa
Virtual Machine Man
[Avatar]

Membro desde: 03/03/2005 10:03:32
Mensagens: 622
Localização: São Paulo
Offline

achei um pouco estranho o teu mapeamento do spring. O erro pode estar aí.

Não há necessidade de mapear o hibernateDaoSpuport.
Faça teu DAO extender a HibernateDaoSupport e injete o sessionFactory.



tua classe DAO



Talvez o erro não esteja aí, porém é uma forma mais correta e elegante de se mapear os DAO's.

T+

Marcelo Madeira - TCS
SCJP 1.5
SCWCD 1.4
blog

Insônia
Debugger
[Avatar]

Membro desde: 24/03/2005 23:06:33
Mensagens: 73
Offline

Ola Marcelo, obrigado pelo seu comentário.

Originalmente meu mapeamento estava conforme sua indicacao, mas como o erro ocorria realizei essa alteracao, seguindo um artigo que achei no ArcMind.

http://www.thearcmind.com/confluence/display/SpribernateSF/Configuring+Hibernate%2C+Spring%2C+OpenInSessionViewFilter+and+MyFaces+JSF?showComments=true#comments

Realizei a modificacao sugerida por voce, mas o erro continua ocorrendo.

Onde será que estou errando?

SCJP, SCWCD
marcelo_mococa
Virtual Machine Man
[Avatar]

Membro desde: 03/03/2005 10:03:32
Mensagens: 622
Localização: São Paulo
Offline

engraçado... segundo o log que vc mostrou, a requisição passou pelo filtro.

Não conheço o jsf, me explique pq você aplicou o filtro nas páginas jsp tb?
Esse .jsf seria o mesmo que o .do do struts?
Se for aplique o filtro somente nele, retire o filtro das jsp.









Marcelo Madeira - TCS
SCJP 1.5
SCWCD 1.4
blog

Kenobi
GUJ Master
[Avatar]

Membro desde: 14/11/2003 13:06:37
Mensagens: 1678
Localização: Brasil
Offline

Hey amigo, tive um problema similar com esse filtro, quando usava o template do Spring e o método merge().

Altere primeiramente o código para o modo anterior, estendendo a classe HibernateDAOSupport e usando o template.

Deixei um código nessa thread - http://www.guj.com.br/posts/list/41629.java , onde alterei uma configuração do OpenSession, e no meu caso funcionou.

Tenta, se der certo, poste pra eu saber

----------------------------------------------------------
SOA|EXPERT - http://www.soaexpert.com.br
SOA de um jeito simples e eficiente.
[WWW] [MSN] [ICQ]
Insônia
Debugger
[Avatar]

Membro desde: 24/03/2005 23:06:33
Mensagens: 73
Offline

Oi Marcelo, obrigado novamente pela sua ajuda!

Eu apliquei o filtro erroneamente nas paginas jsp. Realmente a necessidade existe apenas em aplicá-lo para paginas jsf.

Respondendo sua pergunta: Sim, o .jsf eh para o JSF o mesmo que o .do é para o Struts.

E sobre o log, eu percebi que quando entro na pagina jsf pela url, o filtro é aplicado. Mas, quando clico no botao que dispara a action JSF, o filtro aparentemente nao eh aplicado, pois nao aparece no log a informacao de que ele abriu uma sessao.

Alterei o web.xml, deixando apenas o filtro para paginas jsf, mas o erro persiste

Onde será que está o erro? Já pesquisei bastante na web, mas nao encontrei nada diferente daquilo que estou usando.

Obrigado pela ajuda

SCJP, SCWCD
Insônia
Debugger
[Avatar]

Membro desde: 24/03/2005 23:06:33
Mensagens: 73
Offline

Ola Kenobi, obrigado pelo seu comentario.

Eu tinha visto a thread que vc mencionou, mas como o meu problema ocorre em uma simples consulta (assim como o da thread citada), acreditei que sua solucao nao se aplicava.

Vou realizar as alteracoes por ti descritas, e postarei se obtive sucesso ou nao... tomara que funcione

Valeu pessoal, a ajuda de voces está sendo muito bem vinda.


Obrigado


SCJP, SCWCD
marcelo_mococa
Virtual Machine Man
[Avatar]

Membro desde: 03/03/2005 10:03:32
Mensagens: 622
Localização: São Paulo
Offline

engraçado...

como vc está chamando a action por um botão? vc está usando AJAX? é para dar o post em um form?



Marcelo Madeira - TCS
SCJP 1.5
SCWCD 1.4
blog

Insônia
Debugger
[Avatar]

Membro desde: 24/03/2005 23:06:33
Mensagens: 73
Offline

Kenobi,
tentei utilizar a implementacao que vc sugeriu mas ela nao funcionou tambem :(

Nao sei se eu fiz corretamente. Vejam como ficou meu arquivo web.xml:



e o codigo do filter:



Depurando, percebi que o metodo AutoFlushOpenSessionInViewFilter.getSession eh invocado corretamente no inicio do request, mas a sessão continua sendo fechada antes da requisicao acabar. Ou seja, quando eu executo o seguinte codigo no meu Managed Bean, a sessao acaba:



Estou ficando aflito... onde será que estou errando?

Obrigado

SCJP, SCWCD
Insônia
Debugger
[Avatar]

Membro desde: 24/03/2005 23:06:33
Mensagens: 73
Offline

Marcelo,
estou utilizando um <h:commandButton>, que é um componente JSF. Este componente realiza o submit da pagina.

Minha pagina jsf está assim:



E meu managed bean está assim:



A configuracao desse managed bean no faces-config.xml foi feita assim:



Acredito que esteja tudo correto com as configuracoes acima exibidas.

Como dito no post anterior, o log está informando que a sessao está sendo finalizada assim que o services finalizada sua execucao... o que é estranho para mim, pois tinha entendido que o filtro OpenSessionInViewFilter deveria manter a conexao aberta até o final da requisicao.

Acredito que eu esteja errando em algum ponto, mas nao sei em qual...

Amigos, alguma sugestao?

Obrigado a todos pela ajuda

SCJP, SCWCD
 
Índice dos Fóruns » Desenvolvimento Web
Ir para:   
Powered by JForum 2.1.8 © JForum Team