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