BlazeDS: Flex + Java

7 respostas
Morpheus_Urubu

Depois de fuçar (e muito), vários e vários dias sobre o assunto BlazeDS, venho aqui ao forum para pedir algumas dicas dos usuários mais experiêntes no assunto.

Primeiramente eu gostaria de saber, por que 99% dos artigos espalhados pela WEB citam o Spring como framework MVC, e não outro qualquer, como Struts, VRaptor... (esse ultimo tem um post no blog da caelum porem ensinando a trabalhar com JSON).

Em segundo lugar, gostaria de saber por que novamente em 99% dos artigos, o servidor de aplicações é oTomcat, e nao o Glassfish por exemplo. Existe alguma limitação quanto a este ? Aqui na empresa eu utilizo apenas o Glassfish, e estou na dúvida sobre a compatiblidade, ja que ele nunca é citado.

Agora vamos ao problema mais cabeludo: Não consigo fazer a comunicação utilizando o BlazeDS. Só consegui fazer a integração através do objeto HTTPService, atraves de mensagens JSON, porem este metodo se mostrou muito ineficiente, ja que em meus projetos eu uso VRaptor, e eu gostei da ideia de "espelhamento" entre uma entidade JAVA e ActionScript 3.

Tentei seguir o tutorial
http://blog.digows.com/integrando-adobe-flex-blazeds-springframework-hibernate-uma-soluo-opensource-para-sistemas-web-parte-1/

porem não obtive sucesso. Mais uma vez noto que 99% dos artigos citam Eclipse e não Netbeans... por que ?

Meus fontes ficaram assim:

Classe de servico (logica), que se comunicara diretamente com o flex:
package br.com.facenet.javaflex.servico;

import br.com.facenet.javaflex.entidade.Aluno;
import br.com.facenet.javaflex.persistencia.AlunoDAO;
import org.vraptor.annotations.Component;


@Component
public class AlunoLogic {

    private Aluno aluno;
    private AlunoDAO dao;
    private String resultado;

    public String matricula(Aluno a) {
        dao.matricula(a);
        return resultado = "sucesso";
    }

    public Aluno getAluno() {
        return aluno;
    }
}
Services-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<services-config>
    <services>
        <service-include file-path="remoting-config.xml" />

        <default-channels>
           <channel ref="my-amf"/>
        </default-channels>

    </services>

    <channels>
        <channel-definition id="my-amf" class="mx.messaging.channels.AMFChannel">
            <endpoint url="http://{server.name}:{server.port}/{context.root}/messagebroker/amf" class="flex.messaging.endpoints.AMFEndpoint"/>
            <properties>
                <polling-enabled>false</polling-enabled>
            </properties>
        </channel-definition>
    </channels>

    <logging>
        <!-- You may also use flex.messaging.log.ServletLogTarget -->
        <target class="flex.messaging.log.ConsoleTarget" level="Error">
            <properties>
                <prefix>[BlazeDS] </prefix>
                <includeDate>false</includeDate>
                <includeTime>false</includeTime>
                <includeLevel>true</includeLevel>
                <includeCategory>false</includeCategory>
            </properties>
            <filters>
                <!--<pattern>Endpoint.*</pattern>-->
                <!--<pattern>Service.*</pattern>-->
                <pattern>Message.*</pattern>
                <pattern>DataService.*</pattern>
                <pattern>Configuration</pattern>
            </filters>
        </target>
    </logging>

    <system>
        <redeploy>
            <enabled>true</enabled>
            <watch-interval>20</watch-interval>
            <watch-file>{context.root}/WEB-INF/flex/services-config.xml</watch-file>
            <watch-file>{context.root}/WEB-INF/flex/remoting-config.xml</watch-file>
            <touch-file>{context.root}/WEB-INF/web.xml</touch-file>
        </redeploy>
    </system>
</services-config>
remoting-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<service id="remoting-service"
    class="flex.messaging.services.RemotingService">

    <adapters>
        <adapter-definition id="java-object"
            class="flex.messaging.services.remoting.adapters.JavaAdapter"
            default="true" />
    </adapters>

    <default-channels>
        <channel ref="my-amf" />
    </default-channels>

    <destination id="alunoLogic">
        <properties>
            <source>
                com.br.facenet.javaflex.servico.AlunoLogic
            </source>
        </properties>
    </destination>

</service>

Componente no flex que realiza a chamada Remota:

<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">

	<mx:Script>
		<![CDATA[
			import mx.controls.Alert;
			import entidade.Aluno;
			import mx.rpc.events.FaultEvent;
			import mx.rpc.events.ResultEvent;
			
			private var aluno : Aluno;
			
			public function salvar() : void {
				this.aluno  = new Aluno();
				this.aluno.idAluno = new Number(codigoInput.text);
				this.aluno.nome = alunoInput.text;
				this.aluno.serie = serieInput.text;
				this.aluno.matriculado = matriculaInput.text;
				alunoService.matricula(aluno);
			}
			
			public function onFault(event:FaultEvent) : void {
				Alert.show("Erro de conexao com o servidor de aplicacoes", "Erro do Sistema");
			}
			
			public function onSuccess(event:ResultEvent) : void {
				Alert.show("Opa conectou com sucesso", "ihullll");
			}
		]]>
	</mx:Script>


	<mx:RemoteObject 
		id		= 	"alunoService"
		fault	=	"onFault(event)"
		result  =   "onSuccess(event)"
		showBusyCursor = "true"
		destination = "alunoLogic"
	/>
		
	<mx:Label x="24" y="79" text="Código"/>
	<mx:Label x="25" y="105" text="Aluno"/>
	<mx:Label x="26" y="131" text="Serie"/>
	<mx:Label x="26" y="157" text="Matrícula"/>
	<mx:TextInput x="96" y="77" id="codigoInput"/>
	<mx:TextInput x="96" y="103" id="alunoInput"/>
	<mx:TextInput x="96" y="129" id="serieInput"/>
	<mx:TextInput x="96" y="155" id="matriculaInput"/>
	<mx:Button x="120" y="213" label="Salvar" click="salvar()"/>
	
</mx:WindowedApplication>

Lembrando que todos os jars referentes ao vraptor e blazeDS estao ok.

por ultimo meu web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
    <servlet>
        <servlet-name>vraptor2</servlet-name>
        <servlet-class>org.vraptor.VRaptorServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>vraptor2</servlet-name>
        <url-pattern>*.logic</url-pattern>
    </servlet-mapping>

     <servlet>
        <servlet-name>MessageBrokerServlet</servlet-name>
        <servlet-class>
            flex.messaging.MessageBrokerServlet
        </servlet-class>
        <init-param>
            <param-name>services.configuration.file</param-name>
            <param-value>/WEB-INF/flex/services-config.xml</param-value>
        </init-param>
        <init-param>
            <param-name>flex.write.path</param-name>
            <param-value>/WEB-INF/flex</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>MessageBrokerServlet</servlet-name>
        <url-pattern>/messagebroker/*</url-pattern>
    </servlet-mapping>
</web-app>

Se alguem quiser as entidades em JAVA e AS3 bem como a classe persistente (nao esta conectando com banco, somente para testes), avisa que eu posto aqui para testes.

Agradeço qualquer informação. Obrigado !

7 Respostas

R

Qual erro que dá?

http://forum.flexbrasil.com.br/viewtopic.php?f=4&t=382
http://www.vraptor.com.br/forum/posts/list/168.page

Grinvon

Vamos lá!

Eu mesmo prefiro o Tomcat ao Glassfish por ser mais leve e rápido, na verdade conheco pouco de Glassfish, oldschool. Mas não vejo problema na utilização de um ou outro em minha ignorância.

Não entendi direito a pergunta relativa ao Spring. Você quer dizer em termos de popularidade?

Se tratando de flex vamos:

1 :

Mapei uma classe de serviço criada no Java, geralmente damos o nome de Service.java, você mapeou a classe AlunoLogic que tem uma referência de Aluno.java que é uma entidade. Essa classe de serviço é que disponibilizará os métodos para inserção, listagem, etc.

A classe Aluno.java deverá ter o seu equivalente Flex chamada de Aluno.as, essa classe deverá apontar para a mesma classe do Java usando RemoteClass tipo:

Verifique se você colocou o RemoteClass, pois senão ele não irá converter para objeto correto e irá converter para “AsObject” do qual não será o mesmo do Aluno.java.

MAS MAS MAS você não colocou qual erro foi gerado, verifique o erro correto, para vermos se o problema é exatamente esse.

Morpheus_Urubu

Então, eu fiz o mapeamento da entidade Aluno.as devidamente com a anotacao [RemoteClass(alias...)]

Ja a minha classe service no Java, seria o que o VRaptor chama de Logic, classe responsavel apenas por acessar a logica de negocios e interligar com a View, algo com metodos como
public void salvarAluno(Aluno aluno) {
   dao.salvar(aluno);
   resultado = "sucesso";
}

public String getResultado() {
   return resultado;
}

Eu assisti algumas video aulas do INFORMATICON, e reparei mais uma vez, que o IDE usado e o Eclipse, ao inves de backend com Netbeans e front com Adobe Flex Builder separadamente, como estou fazendo, e que frontend e backend nesse caso estao sendo usados no mesmo diretorio do projeto. Isso tem alguma coisa a ver ?

Aqui eu preciso que essa conexão seja feita de forma independente, pois sao aplicações AIR em operam em vários hosts (clientes), e os dados vindos do backend devem ficar em uma unica maquina na rede (servidor).

Grinvon

Eu já fiz das duas formas, tanto programando a parte lógica no netbeans e fazendo a parte do Flex no Flex Builder quanto só utilizando o Flex Builder para fazer ambas as partes.

Outra coisa, você copiou a estrutura da pasta WEB-INF do projeto blazeds.war? Daquela forma já é uma aplicação funcional, com as pastas certas e todos os arquivos configurados para um boostrap normal.

Não teria como você colocar exatamente o erro que está ocorrendo?

Morpheus_Urubu

Grinvon:
Eu já fiz das duas formas, tanto programando a parte lógica no netbeans e fazendo a parte do Flex no Flex Builder quanto só utilizando o Flex Builder para fazer ambas as partes.

Outra coisa, você copiou a estrutura da pasta WEB-INF do projeto blazeds.war? Daquela forma já é uma aplicação funcional, com as pastas certas e todos os arquivos configurados para um boostrap normal.

Não teria como você colocar exatamente o erro que está ocorrendo?

hehehe na pressa esqueci de falar o erro

O erro é que NÃO COMUNICA o front com o back end… não há conexão !!!

Você poderia me falar como eu faço para conectar usando RemoteObject setando uma url ou IP de algum host na rede ?

R

Da alguma exception?

Rafael_Nunes

Habilita o log do BlazeDs pra você ver o que tá acontecendo.

No services-config.xml, na linha:

<target class="flex.messaging.log.ConsoleTarget" level="Error">

Troca o level pra DEBUG, ou All.

Criado 20 de julho de 2009
Ultima resposta 21 de jul. de 2009
Respostas 7
Participantes 4