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