Mostrando postagens com marcador BlazeDS. Mostrar todas as postagens
Mostrando postagens com marcador BlazeDS. Mostrar todas as postagens

segunda-feira, 11 de junho de 2012

Endpoint só com o contexto

Quando se cria uma aplicação Flex + Java + BlazeDS o services-config.xml é criado dessa forma:
<endpoint url="http://{server.name}:{server.port}/{context.root}/messagebroker/amf" class="flex.messaging.endpoints.AMFEndpoint"/>

E na hora da compilação este arquivo é lido e o compilador no lugar de server.name coloca localhost e em server.port coloca 8080 e context.root é colocado como está configurado no Flash Builder que normalmente é o nome da aplicação.

Enquanto estivermos trabalhando local, tudo funciona beleza, mas quando passamos a nossa aplicação para um servidor de produção, as requisições AMF simplesmente deixam de funcionar porque estão tentando acessar localhost e não o ip ou nome do servidor onde hospedamos, e por segurança o Flash Player não permite acessar algo externo ao servidor.

Para resolver isso eu altero meu endpoint removendo server.name e server.port ficando como abaixo:
<endpoint url="{context.root}/messagebroker/amf" class="flex.messaging.endpoints.AMFEndpoint"/> 

Com isso não me preocupo mais com servidor onde hospedo minha aplicação, só preciso manter o mesmo contexto.

Pode-se mudar também messagebroker/amf, mas para isso será necessário alterar também o web.xml para que o MessageBrokerServlet "saiba" qual url deve interceptar.

Uma outra dica é digitar no navegador: {server.name}/{context.root}/messagebroker/amf se a aplicação foi startada corretamente então irá aparecer uma tela em branco.

Veja também:
Externalizing Service Configuration using BlazeDS and LCDS

quarta-feira, 4 de agosto de 2010

Client.Message.Encoding

A metatag RemoteClass é usada no topo de uma classe AS para indicar a sua classe espelho Java (ou outra linguagem server) quando se usa RemoteObject.

Para facilitar, normalmente se cria a classe AS com mesmo nome e no mesmo pacote da sua correspondente java. Para usar remoteobject as classes AS e Java precisam ter um método construtor sem parâmetros e os atributos precisam ter o mesmo nome e precisam ser públicos ou com métodos get / set públicos.

Numa aplicação uma classe AS estava num pacote diferente da sua correspondente Java. Quando acesso um método remoto que retorna um objeto desta classe do Java para o Flex vem tipada corretamente, mas quanto tento enviar de Flex para Java dá um fault onde faultCode = Client.Message.Encoding e faultString = Cannot create class of type 'packageAS.classeAS'.

Este erro me chamou a atenção porque sempre imaginei que era só usar o atributo alias de RemoteClass [RemoteClass(alias="pacoteServer.classeServer")] apontando para a classe sever corretamente que iria funcionar, mas no fim o pacote e nome da classe precisam ser iguais.

Procurando na documentação algo que explicasse este fato não encontrei nada, mas achei algo interessante: "In the ActionScript class, you use the [RemoteClass(alias=" ")] metadata tag to create an ActionScript object that maps directly to the Java object." Isto é, usar alias com um espaço em branco vincula com sua classe server com mesmo pacote e mesmo nome de classe.

quarta-feira, 16 de junho de 2010

Serialização incorreta de objetos Map no BlazeDS

Estou utilizando na minha aplicação o BlazeDS e alguns métodos retornam para o Flex objetos Map onde o key é um Integer ou uma classe minha. Para minha supresa quando chega no lado client (Flex) o key do Map chega correto mas o value chega null. Se eu colocar o key como String e o value como Integer ou uma classe minha aí funciona tudo corretamente.

Pesquisando no Adobe Bug System verifiquei que esta situação já está corrigida e provavelmente será liberada no BlazeDS 4.

Veja mais (Adobe Bug System):
AMF Serialization from Java to AS not working corectly for Map Types
Fetch parameterized java hashmap back to Flex correctly
Strong type support in Collection and Map