"Seguinte... se no Java estiver trabalhando com Integer / Long /
Double (são wrappers, não são tipos nativos) e o Flex te mandar um
NaN, o BlazeDS vai serializar para null?!? Acho q nao.... qual versao
do BlazeDS está usando?"

Nao, pelos meus testes ele converte pra 0.

Estou tendendo para a opção 4. Achei este tópico no flexbrasil do Felipe:

"Bom dia,

Segundo a própria Adobe ela não considera como um BUG, bom, deixa eu
tentar explicar.

No flex não existem númericos como NULL e sim NaN(Not a Number) que se
você observar teóricamente os NaN's para o Java(Double.NaN) possuem
uma referência e não são nulos e que ao ser "traduzido" para o Java e
se o objeto esperado para esse número for um Long por exemplo o
BlazeDS ao fazer algo como "referenciaDoNumeroDouble.longValue()" o
JAVA AUTOMATICAMENTE joga 0 ou seja nao é um BUG porque NaN não é
NULL. Por ser assim funcionalmente está correto, mas não atende ao uso
de muitos programadores, que precisam necessariamente que venha NULL,
para evitar mais polêmica, sim eu concordo que Adobe poderia fazer com
que no FLEX, lá mesmo, para os Number's fosse NULL por default e não
NaN.

Lembrando que tratar isso na camada de negócio você poderá ter
inúmeros problemas, por exemplo: e se você quiser que realmente venha
0 do Flex? Então bastante cuidado.

E para resolver isso, sendo que raramente em uma galáxia muito
distante eu vou usar o NaN? hehhehehe

1. Estude muito o fluxo do BlazeDS antes de passar para a camada de
Negócio do seu back-end. Como?
Resp: Você pode criar reimplementar classes do blazeDS no momento que
ele está deserializando os objetos são elas:
1. AMFEndpoint
2. AmfMessageDeserializer
3. Amf0Input
4. Amf3Input

e na classe Amf3Input você sobreescreve o método readObject() e faz da
seguinte maneira:

@Override
public Object readObject() throws ClassNotFoundException, IOException {
Object value = super.readObject();
if (value instanceOf Double && ((Double).value).isNaN()){
value = null;
}
return value;
}

Att. e espero ter ajudado,

Felipe Leonhardt"

http://forum.flexbrasil.com.br/viewtopic.php?f=8&t=1843&p=5814#p5814

2009/10/21 Mário Júnior <[email protected]>:
> Acho q isso merece um post no blog.... Estendendo e ENNNtendendo o
> JavaAdapter do BlazeDS .... assim q tiver tempo posto lá.
>
>
>
> 2009/10/21 Mário Júnior <[email protected]>
>>
>> Olá pessoal!
>>
>> Seguinte... se no Java estiver trabalhando com Integer / Long / Double
>> (são wrappers, não são tipos nativos) e o Flex te mandar um NaN, o BlazeDS
>> vai serializar para null?!? Acho q nao.... qual versao do BlazeDS está
>> usando?
>>
>> Como Frederico disse, as opções 1 e 2 não se aplicam ao caso do Eduardo,
>> pq ele PODE precisar do numero 0 (zero). Então, o correto é aplicar a
>> solução 3 ou 4 (eu uso a 4, mais flexivel).
>>
>> Assim, se o BlazeDS te mandar um 0 (zero) vc vai persistir o 0(zero), mas
>> lembre-se que o Number em AS3 não existe null, existe o NaN (Not a Number),
>> e o BlazeDS "padrao" converte NaN para 0 por isso q usar wrappers (nos meus
>> testes) nao funcionaram! Portanto, o ideal é oq o Frederico disse: aplique
>> as opções 3 ou 4.. bom, eu mesmo posso recomendar a 4.
>>
>>
>>
>> Abraços.
>>
>>
>>
>>
>>
>>
>>
>> 2009/10/21 Augustus Costa <[email protected]>
>>>
>>> Essa sua solução é meio gambiarra vei... isso por que minha coluna no
>>> banco pode aceitar um zero, como no exemplo velocidade de um veiculo...
>>>
>>> Acho muito melhor vc deixar (nesses casos) o tipo no flex como object pq?
>>> pq caso vc esteja usando Integer no Java o resultado pode ir nulo.
>>>
>>> 2009/10/21 Frederico Lellis <[email protected]>
>>>>
>>>> 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]
>>>>
>>>> ******************************************************
>>>>
>>>>
>>>
>>>
>>>
>>> --
>>> Horus Augustus C. C. Lima
>>>
>>> Sagarana Tech
>>> Mobile +55(85)8842.4402
>>> Desk +55(85)3304.6530
>>> [email protected]
>>> http://www.sagaranatech.com
>>>
>>>
>>
>>
>>
>> --
>> Mario Junior
>> Enterprise Java / Flex Architectures
>> Adobe Certified Expert Flex 3 with AIR
>>
>> Sofshore Informática
>> http://www.sofshore.com.br
>> +55 (48) 3337 2003
>> Rua Pastor Willian Richard Schisler Filho 452 sl 102, 88034-100 Itacorubi
>> Florianopolis SC Brasil
>
>
>
> --
> Mario Junior
> Enterprise Java / Flex Architectures
> Adobe Certified Expert Flex 3 with AIR
>
> Sofshore Informática
> http://www.sofshore.com.br
> +55 (48) 3337 2003
> Rua Pastor Willian Richard Schisler Filho 452 sl 102, 88034-100 Itacorubi
> Florianopolis SC Brasil
>
> >
>

--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---

Responder a