Flex, Grails e BlazeDS

Bom, como sou basicamente um programador Flex, preciso de coisas que facilitem minha vida com relação ao back-end.

Conheci o Grails e estou gostando bastante da praticidae. Já havia tentado trabalhar com Java outras vezes mas desisti antes de começar a produzir só pela complexidade dos ambientes. Até que o Grails apareceu pra resolver esse problema. Há dezenas de tutoriais por aí sobre isso mas aqui vai mais um bem simples de como começar.

Primeiramente você vai precisar do Java SDK (JDK), estou usando o 7. Instale-o e configure as variáveis de ambiente JAVA_HOME apontando para o diretório do JDK e na variável PATH adicione o caminho para a pasta ..jdk\bin.

Baixe o Grails (estou usando a versão 1.3.7) (http://grails.org/Download), descompacte a pasta em um diretório de sua preferência. Não se preocupe muito pois não há instalação e todo o seu workspace vai ficar fora deste diretório.
Configure a variável de ambiente GRAILS_HOME apontando para o diretório onde o instalou e adicione o caminho para o diretório ..grails\bin na variável PATH.

Detalhe, todas essas variáveis devem estar no mesmo ambiente, seja de sistema ou de usuário.

Abra um console e rode grails, se tudo estiver OK você verá uma mensagem de boas vindas. Se der erro, verifique suas variáveis de ambiente.

Você pode usar o Grails só com comandos no shell/prompt, mas eu prefiro usar uma IDE. Escolhi a StringSource Tool (STS) dizem que não é a melhor, mas é free e baseada no Eclipse que sou mais acostumado por conta do Flash Builder. Você pode baixar aqui ou procurar por outra IDE de sua preferência.

Instale, configure o workspace e instale o plug-in do Grails que você vai encontrar na aba Extensions da página Dashboard do STS.

Crie um novo projeto Grails no STS como exemplolista. Ele vai baixar e instalar tudo que for necessário, aguarde. Feito isso instale o plug-in BlazeDS no seu projeto. Você pode usar o botão do Grails para digitar comandos e usar o comando “grails install-plugin blazeds” (com o projeto selecionado) ou usar o gerenciador de plugins do STS clicando com o botão direito na pasta plugins do seu projeto. O comando é mais rápido pois não precisa carregar todos os plugins disponíveis, mas ambas as formas irão instalar o BlazeDS no seu projeto juntamente com qualquer dependência como por exemplo o Spring Security que pode entender melhor ao final do artigo nas referências.

Agora vamos aos códigos!

Na pasta domain do seu projeto crie uma nova classe domain (New-> Domain Class) e crie por exemplo br.com.flexbrasilia.domain.MyItem e edite da seguinte forma:

package br.com.flexbrasilia.domain
 
class MyItem {
 
	String nome
 
    static constraints = {
    }
}

Ao rodar sua aplicação, baseado nos seus domains o Grails automaticamente cria um banco de dados temporário para você testar sua aplicação, então tudo que precisamos é inserir alguns dados para teste. Abra o arquivo Bootstrap.groovy da pasta conf do seu projeto e o deixe da seguinte forma:

import br.com.flexbrasilia.domain.MyItem;
 
class BootStrap {
 
    def init = { servletContext ->
 
		new MyItem(nome: "Item 1").save()
		new MyItem(nome: "Item 2").save()
		new MyItem(nome: "Item 3").save()
 
    }
 
    def destroy = {
    }
}

Agora precisamos criar um DTO ou VO para serializar com o Flex. Pra isso crie uma Groovy Class (br.com.flexbrasilia.vo.MyItemVO) na pasta src/groovy e a deixe da seguinte forma:

package br.com.flexbrasilia.vo
 
class MyItemVO {
 
	Long id
	String nome
 
}

Note que no VO temos a propriedade id inexistente no domain MyItem. Isso porquê o Grails cria automaticamente id pros seus domains.

Agora só precisamos criar o serviço. Crie um novo service dentro da pasta services (br.com.flexbrasilia.services.ItemService) e o deixe da seguinte forma:

package br.com.flexbrasilia.services
 
import org.springframework.flex.remoting.RemotingDestination;
import org.springframework.flex.remoting.RemotingInclude;
 
import br.com.flexbrasilia.domain.MyItem;
import br.com.flexbrasilia.vo.MyItemVO;
 
@RemotingDestination
class ItemService {
 
        static transactional = false
 
	@RemotingInclude
        List<MyItemVO> getAllItems() {
		return MyItem.findAll().collectAll { 
			new MyItemVO(id: it.id, nome: it.nome)
		}
	}
}

As annotations @RemotingDestination e @RemotingInclude servem pra disponibilizá-los ao Flash Builder como será mostrado posteriormente.

Seu back-end está pronto, mande rodar o projeto pra fazermos o Flex. Você pode usar o botão do Grails e usar o comando “grails run-app” ou clicar com o botão direito no projeto e mandar rodar como Grails Command (run-app). Seu console deve terminar com algo parecido com isso:

Configuring Spring Security ...
Configuring Spring Security ACL ...
[BlazeDS]Endpoint 'my-polling-amf' created with security: None
at URL: http://{server.name}:{server.port}/{context.root}/messagebroker/amfpolling
[BlazeDS]Endpoint 'my-longpolling-amf' created with security: None
at URL: http://{server.name}:{server.port}/{context.root}/messagebroker/amflongpolling
[BlazeDS]Endpoint 'my-amf' created with security: None
at URL: http://{server.name}:{server.port}/{context.root}/messagebroker/amf
[BlazeDS]Endpoint 'my-secure-amf' created with security: None
at URL: https://{server.name}:{server.port}/{context.root}/messagebroker/amfsecure
Server running. Browse to http://localhost:8080/exemplolista

No Flash builder (estou usando o Burrito, com a versão 4.5.1 do SDK) crie um novo projeto Flex com o nome exemplolista-flex. configure o projeto para usar um servidor Java / BlazeDS com os seguintes parâmetros (é necessário que sua aplicação Grails esteja rodando):
Root folder: o caminho para a pasta web-app do seu projeto Grails (ex: E:\Dev\workspace-STS\exemplolista\web-app)
Root URL: o endereço em que o projeto ira rodar, é o mesmo que o Grails gerou na última linha do console quando você rodou a aplicação (ex: http://localhost:8080/exemplolista.
Context root: coloque /exemplolista.
Output folder: coloque o mesmo do Root folder (ex: E:\Dev\workspace-TST\exemplolista\web-app

Valide a configuração e não se preocupe com o warning. Finalize a configuração.

Na aba Data/Services do seu projeto Flex clique em Connect to Data/Service, escolha a opção BlazeDS e clique em Next. No pop-up de autenticação marque a opção No password required, clique em OK e TADAAA! Seu serviço configurado no Grails (itemService) deve estar ali, pronto pra você. Marque ele e clique em Finish.

Você verá que agora você tem suas classes ItemService e MyItemVO disponiveis no seu projeto Flex.
Você não deve alterar as classes que começam com “_” pois elas são o reflexo das classes no Grails, e toda vez que você mudar algo no Grails você precisará remover os serviços e adicionar novamente para atualizá-los no Flex (você tem a opção de apenas mandar atualizar os serviços, mas nem sempre funciona). Porém, ao remover os serviços ele irá remover apenas as classes que iniciam com “_” e ao adicionar novamente ele irá apenas recriar as classes com “_” e ignorar as outras. Dessa forma você pode adicionar qualquer coisa que seja importante apenas para seu front-end nas classes sem “_”.

No modo Design adicione um componente do tipo List, clique no método getAllItems() e arraste para dentro da sua List. Vai aparecer um pop-up, mude apenas o Label field para “nome”.

Pronto, mande rodar a aplicação Flex e você deverá ver a lista com seus 3 itens adicionados no Bootstrap.groovy.

Legal, né? :D

Este exemplo foi feito bem similar ao do Sebastien Arbogast por um motivo. Se você quiser se aprofundar mais em Grails + Flex ele tem alguns artigos que explicam além de onde fui como por exemplo o Spring Security. E que você pode seguir partindo do exemplo que acabou de fazer.
Spring Securityhttp://sebastien-arbogast.com/2010/11/15/flex-on-grails-take-2/

One Responseto “Flex, Grails e BlazeDS”

  1. Pedra, bastante prático esse artigo. Verifico que o grails utiliza o Spring e hibernate por tras: Aquilo que, na maioria, todo projeto Java precisa. Legal conhecer o grails assim. Realmente é bastante prático.

Leave a Reply

Your email address will not be published. Required fields are marked *

*


*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">