Bom dia Eduardo,
Vou colar uma resposta dada pelo Mario que tive sobre o mesmo assunto.
"Ola Frederico.... cara.. ja tive muito essas encheçoes de saco do
BlazeDS... vc tem 4 formas de resolver isso:
1) No setter do seu id, vc pode verificar se o valor passado no
argumento for 0 (zero), entao sete-o para null.
2) Caso vc nao queira "poluir" suas entidades com essa validacao
chata, vc poderá validar isso nas suas classes de servicos.
Qnd vc receber uma entidade com id == 0, entao sete-a para null. É a
mesma coisa da solução anterior, só mudamos de lugar nao mais no
setter da entidade, mas agora fazer na classe de servico antes de
passar o seu objeto para seu dao ( receio q esteja usando algum ORM -
i.e hibernate).
Essas duas solções funcionam, mas podem ser um pouco "chatas" uma vez
q se terá SEMPRE q fazer o "if (entidade.getId == 0)" ...
Entao se o programador esquecer de fazer isso em algum momento, já
era! Além de tornar a pratica repetitiva, está sujeita a falhas.
Agora... vou falar as outras duas formas.... prepare-se para imergir
no mundo BlazeDS (yes! Imersão BlazeDS.. hehe)
Seguinte.. 98% dos usuarios java/flex que usam BlazeDS mal conhecem
sua estrutura, por isso se perdem com essas coisas.
Oq vou dizer aqui vi pouca gente usar, lá vai.
3) Criar seu fork do BlazeDS:
Baixe o source do BlazeDS, abra a classe Amf3Input.java e sobrescreva
o metodo read(), inserindo o seguine trecho de codigo:
@Override
public Object readObject() throws ClassNotFoundException, IOException {
Object value = super.readObject();
if (value instanceOf Double && ((Double).value).isNaN()){
value = null;
}
return value;
}
Muita atenção para esse trecho: ((Double).value).isNaN())
Isso significa que se o Flex me mandar um NaN (Nota a Number) vou
converte-lo para null, e nao para 0 (zero) como é o procedimento
normal.
É aí q está o segredo da serialização de numeros (long / int) entre Fx <=> Java!
Alterada a classe, compile o BlazeDS e utilize sua versao propria.
4) (A forma que EU uso)
O BlazeDS é flexível a ponto de eu criar meu proprio Adapter (classe
responsavel por invocar as suas classes de serviço no Java).
Entao, oq eu faço é extender a classe JavaAdapter e sobreescrever o
método invoke()
Nesse ponto vc tem acesso aos parametros (de entrada e saída) de serialização.
Com isso em maos, vc pode usar Reflexao para validar/alterar os
valores q chegam do Flex (e os q vao tb).
Assim fica mais generico, e bem mais reaproveitavel.
Espero ter ajudado.
Abraços."
Eu implementei do lado do java os checks, mas no seu caso voce tera
que implementar a solução número 4 ou 3.
espero ter ajudado.
obs: caso voce venha a fazer a solução numero 4, disponibiliza a
classe aqui para o grupo?
abraços.
2009/10/21 Eduardo Rodrigues <[email protected]>:
>
> Bom dia pessoal,
>
> Andei lendo e testando e o quando tenho um objeto Number nulo no lado
> do flex o comportamento é que ele é serializado para o valor default
> no java.
> Digamos que eu mapeie um Integer no java e um Number no flex, quando o
> number está nulo ele vai 0 pro java, mesmo sendo Integer um wrappper
> que poderia ser perfeitamente serializado para null.
> Em aplicações que o valor 0 é um valor significativo e nulo é a
> ausência de valor este comportamento não é desejado.
> Ex:
> Lançamento de notas de provas escolares.
> O aluno quer saber quando sua nota não foi lançada (nulo) ou se ele tirou 0.
>
> Como vocês costumam tratar este tipo de caso? Eu realmente não quero
> criar um boolean do tipo "valor lançado" pois isto é muito
> anti-natural no meu ponto de vista.
>
> Estou usando BlazeDA + java 5+
>
> Obrigado!
>
> >
>
--
--
******************************************************
Frederico Lellis de Albuquerque
Analista Desenvolvedor Java/Flex Pleno.
Graduado Em Ciência da Computação
[email protected]
******************************************************
--~--~---------~--~----~------------~-------~--~----~
Você recebeu esta mensagem porque está inscrito na lista "flexdev"
Para enviar uma mensagem, envie um e-mail para [email protected]
Para sair da lista, envie um email em branco para
[email protected]
Mais opções estão disponíveis em http://groups.google.com/group/flexdev
-~----------~----~----~----~------~----~------~--~---