Alguém já passou por este erro?

48 views
Skip to first unread message

Darlan Santos

unread,
Jul 1, 2008, 8:24:27 AM7/1/08
to fle...@googlegroups.com
Bom dia Pessoal,

A dois dias estou com um erro persistente em uma aplicação teste que estou desenvolvendo.
Estou usando (granite) Seam + Flex.
Está dando o seguinte erro:

"RPC Fault faultString="Didn't receive an acknowledge message" faultCode="Server.Acknowledge
.Failed" faultDetail="Was expecting mx.messaging.messages.AcknowledgeMessage, but received null""

O serviço é chamado, coloquei um breakpoint no ejb gerado pelo seam e é executado perfeitamente, o método retorna uma lista. (List<LojaTO>)

No action script o método que captura os erros da chamada retorna essa mensagem em destaque acima.

Alguém já passou por este erro?

Abraços,

Darlan.


Darlan Santos

unread,
Jul 2, 2008, 8:53:17 AM7/2/08
to fle...@googlegroups.com
Pessoal,

Olha direito o log vi que foi um erro velho e conhecido de Lazy. Ou seja, a sessão já estava fechada quando ele(JPA hibernate) tentou acessar um objeto. :( Estou vendo que vou ter vários problemas com LazyInitializationException.

Alguém já passou por isso? Lembro que no spring passei por isso, e lá usei um filtro no web.xml pra tratar desse problema. E agora com flex(Flex + Seam) qual o procedimento?


8:19:32,468 ERROR [LazyInitializationException] could not initialize proxy - no Session
org.hibernate.LazyInitializationExceptio

: could not initialize proxy - no Session

at org.hibernate.proxy.AbstractLazyInitializer.initialize(

AbstractLazyInitializer.java:57)

at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(

AbstractLazyInitializer.java:111)

at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(

JavassistLazyInitializer.java:166)

at br.com.dedrgm.smartbusiness.seguranca.entity.Loja_$$_javassist_3.toString(Loja_$$_javassist_3.java)

at java.lang.String.valueOf(

String.java:2615)


2008/7/1 Darlan Santos <darla...@gmail.com>:

Rodrigo Pereira Fraga

unread,
Jul 2, 2008, 5:26:50 PM7/2/08
to fle...@googlegroups.com
No BlazeDS não tem suporte nativo a LazyLoad, há projetos correndo paralelo, porém nenhum homologado.

A melhor solução seria remover os Lazy dos relacionamentos e colocar Eager,
ou então manter os Lazy's, só que criar um interceptor ou um filter para carregar o lazy, só que não seria muito viavel,
pois o BlazeDS iria carregar todos os objetos Lazy no momento de serialização.

Abraços.

Atenciosamente:
-----------------------------------------------
| Rodrigo Pereira Fraga|
http://www.digows.com/
http://forum.flexbrasil.com.br/
-----------------------------------------------

2008/7/2 Darlan Santos <darla...@gmail.com>:



--

Mário Júnior

unread,
Jul 2, 2008, 7:53:00 PM7/2/08
to fle...@googlegroups.com
Well...também tive esse mesmo problema, e tentei junto com um amigo encontrar alguma solução... segue abaixo um breve resumo da ópera...


/***************************************************************
* ATENÇÃO: E-mail com texto looooonnnggoo....
*
****************************************************************/


Oq acontece No BlazeDS:
No momento de serializar os objetos, todos os atributos sao invocados. (setter/getters tb caso sejam privates)
Como "contornar": setar as colecoes para null.


no Flex:
qnd os objetos serializados chegam do blaze, acontece a mesma coisa no fw do flex com as classes AS3, todos os atributos sao carregados (acho q isso acontece por causa do Bindable, mas nao achei o ponto especificamente dentro do fw)


Tentativa de Resolver o Problema:
Juntamente com um amigo meu, Eduardo Rebola, tentamos...

Criar uma espécie de proxy no flex que faria o carregamento de objetos dos servidor. Esse proxy iria "observar" atributos q tivessem uma meta-tag propria ( [LazyLoad]) e nao invocá-los, setando-os null diretamente.
Somente qnd o getter de um atributo marcado como [LazyLoad] fosse chamado, daí sim disparar uma requisicao para o servidor para carregar os objetos de uma colecao específica. Mas para isso, precisaria de um Command mais genérico e abstrato no lado do java que carregasse qualquer colecao e relacionamento "filho" a partir de uma chave de relacionamento com o "pai".

Bem, esse meu amigo fez algo legal aproveitando o desenvolvimento de um outro framework chamado de Vulcano desenvolvido pela empresa maringaense InsulaTI (http://blog.insula.com.br/). No entanto, eles optaram por usar o GWT para a camada de visao e nao o Flex, logo, essa implementacao de carregar colecoes foi descontinuada e removida da versao alpha-test do vulcano.

Uma possível soluçao: (sobre a primeira parte que eu comento no meu blog):
Vcs podem tentar criar um serviço genérico que carregue relacionamentos de objetos a partir de uma chave (fk) e depois anexar ao objeto pai (tipo, fazer um attach da coleçao),

E criar um método na sua classe de entidade (ou onde vc quiser) para disparar a requisiçao e invocar o método no servidor.

Algo do tipo:
[Bindable]
[RemoteClass(alias="seu.pacote.java.Usuario.class")]
public class Usuario {

  private var id : Number
  private var nome : String;

  //Aqui é a coleçao
  private var permissoes : ArrayCollection

  //getter e setter omitidos...

  //aqui vc invoca o serviço para carregar a colecao
  public function loadCollection(chaveFK : Object) {
    //dispara o serviço e pega o resultado
    //com o resultado na mao, e nessa classe, vc seta o resultado com o setter da colecao
    permissoes = <resultado q veio do servidor>
  }
}


Bem... um exemplo bem hipotético, mas na aplicação vc usaria assim:

var usuario : Usuario = new Usuario();

usuario.id //para recuperar/setar o id
usuario.nome //para recuperar/setar o nome
usuario.permissoes // nesse ponto vai estar nulo, pq nao foi carregado a colecao

usuario.loadCollection(usuario.id); //aqui manda carregar a colecao do servidor, e settar o resultado na colecao
usuario.permissoes // agora vc tem a colecao carregada, pelo metodo invocado na linha anterior.

O problema disso é ter q fazer o loadCollection sempre antes de usar a colecao... oq é muito chato :S


Outras idéias/soluçoes ....


EAGER x OpenSessionInView
Os dois terao o mesmo resultado.... as suas colecoes serao carregadas sempre q o "objeto pai" for carregado.
Logo, usar um filter para o OpenSessionInView é um "fake lazyLoading"!
Se for usar isso, entao use logo o EAGER....


npHibernate:
Ja tentei uma vez, faz tempo, nao carregou colecoes de colecoes... para o meu caso, nao serviu.

GraniteDS:
Também propoes uma solução, mas tive o mesmo problema relatado acima.



Bem... se algu[em mais souber de alguma coisa, outros projetos, ou tem alguma idéia para tentarmos resolver, coloco-me a disposição.



Abraços a todos!

--
Mário de Souza Júnior
Programador Java / Flex : AS3 / PHP
(44) 4009-3550 Maringá-PR
http://blog.mariojunior.com
junin...@gmail.com (gtalk, msn, etc..)

Rodrigo Pereira Fraga

unread,
Jul 2, 2008, 8:20:05 PM7/2/08
to fle...@googlegroups.com
Olá Mário,
 
Então colega, o projeto que conheço que foi mais além, foi o dpHibernate.
 
Não sei quando você testou ele, mas o último build dele funcionou comigo tanto com Spring tanto Pojo.
 
Em: trunk/samples/
 
O problema desse kra, é que tem que mudar algumas coisas em um código já existente, o que o torna um pouco invasivo pelo menos no lado do Flex. Os DTO's tem que extender um objeto em específico.
 
Em geral, a ideia dos kras foi boa, eu sempre que tenho tempo, estou mechendo um pouco no projeto e tentando adicionar melhorias.
 
Levo como passatempo, se você tem um mínimo de tempo disponível, vá brincando com o bixo, quem sabe não aprimoramos uma nova alternativa?
 
Beleza?
 
 
Abraços!
 
Atenciosamente:
-----------------------------------------------
| Rodrigo Pereira Fraga|
http://www.digows.com/
http://forum.flexbrasil.com.br/
-----------------------------------------------

 
2008/7/2 Mário Júnior <junin...@gmail.com>:

Mário Júnior

unread,
Jul 2, 2008, 8:41:05 PM7/2/08
to fle...@googlegroups.com
Pode ser... vou ver se há alguma nova implementação ou release depois da ultima vez q mexi com ele...
A idéia do Eduardo e minha era a de fazer algo sem nenhum ou com o mínimo possível de código intrusivo.

Vou baixar o dpHibernate novamente..


Abraços e sucesso!

Darlan Santos

unread,
Jul 3, 2008, 12:35:29 AM7/3/08
to fle...@googlegroups.com
Pois é....
 
Eu consegui resolver esse problema de uma outra forma. Na realidade tive que mudar um pouco a arquitetura do projeto. Agora estou usando *TO (transfer object). Então o negócio ficou mais ou menos assim:
Flex <-> *TO <-> Seam.
Deixo o mapeamento gerado pelo Seam e nas classes *Action transformo os Entity para TO e repasso para camada de apresentação(flex - granite). Tentei de todas as formas resolver esse problema de lazy, mas com essa minha 'adoção' de solução darei continuidade no projeto.
 
Obrigado pela atenção de todos.
 
Att.

Darlan.

2008/7/2 Mário Júnior <junin...@gmail.com>:

Mário Júnior

unread,
Jul 3, 2008, 12:41:14 AM7/3/08
to fle...@googlegroups.com
Sim... seu TO no caso sao os mesmos VOs ou DTOs....
é um caminho de contorno, mas nao uma soluçao.... mas é valido.

De qualqeur forma, mesmo com VO, se vc precisar carregar uma coleçao usando o getter no Flex, no Java nao funcionará.
A essencia do VO é passar o objeto da forma q vc precisa no view, se precisar de algum dado q o VO nao contenha, entao terá q buscar no servidor declarando mais um servi;co no java, outro remote object no flex, outro command para tratar o result, etc.. etc...

Essa volta q queríamos eliminar... o ideal seria o proprio conceito q de LazyLoad, fazer um getColecao, e ela estar ali, disponivel.... mas. acho q vamos demorar para ter essa integração simples assim...

Enquanto isso, qualqeur coisa q nao dispara um lazy initialization exception está valendo =D

Abraços
Reply all
Reply to author
Forward
0 new messages