Mário, eu já consegui redefinir o JavaAdapter no meu remoting-config.xml, vc têm alguma referência que mostre como redefinir os outros pontos??? No caso o Amf3Input, mas eu gostaria de saber quais são todas as possibilidades de extensão do BlazeDS...
2009/10/21 Frederico Lellis <[email protected]>: > > 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 -~----------~----~----~----~------~----~------~--~---
