
Problemas com serialização AMF – Aplicações Java/Flex
maio 24, 2010Buenas galera, tudo certo?
São comuns alguns erros em aplicações Java/Flex na hora de serializar os objetos entre as tecnologias. Como são tecnologias em linguagens diferentes, para focos diferentes (pelo menos em 90% dos casos, o Java é o backend, e o ActionScript é o frontend), existe um problema que naturalmente ocorre em projetos que não são simples CRUD.
Um exemplo – semana passada, estávamos no meio de uma iteração, fazendo uma listagem de configurações de parâmetros para o servidor. Na camada Flex, o objeto serializado não era recuperado como o tipo apropriado (exemplo – com.meupacote.MinhaClasse), mas sim, com o tipo Object do actionScript.
A classe em Java era no seguinte formato:
package com.meupacote;
public class MinhaClasse {
private Long id;
private String nome;
private Double valor;
//getters, setters e construtor padrão omitidos
}
E a classe ActionScript:
package com.meupacote {
[RemoteClass(alias="com.meupacote.MinhaClasse")]
public class MinhaClasse {
public MinhaClasse(){}
public var id: Number;
public var nome:String;
public var valor:Number;
}
}
Deve-se verificar alguns pré-requisitos para que a serialização seja feita corretamente:
- O BlazeDS deve estar configurado corretamente
- A metatag RemoteClass deve estar configurada para a classe Java correta, sem erros de “typo”
- A classe Java deve ter um construtor padrão (vazio), e as propriedades que desejamos expor ao Flex devem possuir métodos de modificação e acesso no modelo JavaBeans.
Mas apenas isso não garante que a classe será serializada corretamente. No meu caso, por exemplo, fizemos um componente que recuperava os objetos, mas os objetos não estavam tipados como MinhaClasse, mas sim como Object.
Isso acontece porque no caso onde o objeto ActionScript não é instanciado em nenhum lugar da aplicação, ou seja, no SWF gerado não existe nenhum “import” para esta classe, o compilador não “conhece” a classe, e por isso o tipo não era o MinhaClasse, mas sim, Object.
Existem duas maneiras de adicionar esse suporte – ou se coloca registerClassAlias na application, ou simplesmente em alguma parte do sistema, se inicializa uma instância da classe especificada (new MinhaClasse());
Pois bem, utilizamos primeiramente registerClassAlias, e a aplicação funcionou perfeitamente. O problema foi quando adicionamos um caso de uso de inserção do objeto, ou seja, passar o objeto da camada Flex para Java, que causava uma exception no BlazeDS – Cannot find class com.meupacote.MinhaClasse.
Como já explicado, existem os dois mecanismos para “registrar” uma classe para fazer parte da compilação. Como é necessário criar o objeto, deve-se remover o registerClassAlias para que não tente ser registrada duas vezes a mesma classe.
Com isso foi possível solucionar esse pequeno problema que causa um transtorno momentâneo em projetos e entregas
TIve esse problema, solucinei instanciando as classes que o compilador nao conhecia..
Sabe uma maneira mais descente de fazer isso ?
Com o register class, é necessário registrar classe a classe, ai é meio foda, pois estarão fixas as classes que compoem o modelo…