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