Alguem que ja implementou a opção numero 4 (né Mario hehehe) podia
disponibilizar a classe aqui pro grupo ne?

abraços.


2009/10/21 Eduardo Rodrigues <[email protected]>:
>
> "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
>>
>> >
>>
>
> >
>



-- 
-- 
******************************************************

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

Responder a