Bom dia galera do GUJ!
Estou estudando Flex e sua integração com o Java, logo achei um Post recente no site/blog do Horochovec, segue o link:
http://www.horochovec.com.br/blog/2010/03/23/flash-builder-flex-sdk-4-java-blazeds-tutorial/
Seguindo o exemplo dele deu tudo certo, os dados são informados nos formulários em flex e salvos em um ArrayList na classe ContatoService.java daonde os mesmos são listados depois …certo, seguindo a maneira mais simples e básica de persistência, eu alterei essa classe para um método que abre um conexão e grava no banco através do PreparedStatement, a classe ficou assim:
public class ContatoService {
public void addContato(Contato contato) {
Connection con = new FabricaConexao().getConexao();
String sql = "insert into pessoa(nome,email) values(?,?)";
try {
PreparedStatement ps = con.prepareStatement(sql);
ps.setString(1, contato.getNome());
ps.setString(2, contato.getEmail());
ps.execute();
ps.close();
} catch (SQLException e) {
System.out.println("Erro na Inserção de Contato");
e.printStackTrace();
}
}
public ArrayList getListContato() {
Connection con = new FabricaConexao().getConexao();
String sql = "select * from pessoa";
ArrayList listContato = new ArrayList();
try {
PreparedStatement ps = con.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while (rs.next()) {
Contato contato = new Contato();
contato.setNome(rs.getString("nome"));
contato.setEmail(rs.getString("email"));
listContato.add(contato);
}
ps.close();
rs.close();
} catch (SQLException e) {
System.out.println("Erro na Consulta de Contato");
e.printStackTrace();
}
return listContato;
}
}
Pensei que apenas alterando a persistência iria dar tudo certo, em teoria parecia que sim, mas a classe Flex => FlexDuck.mxml me envia um Alert “Erro” , e mesmo debugando eu não consegui entender o motivo…
Bom, caso perguntem: Assim que eu fiz as alterações na classe Java eu fiz um novo deploy na pasta webapps do TomCat, eu fiz e refiz a aplicação em Flex no FlashBuilder 4, testei os métodos da classe acima no Java, fazendo uma inserção normal…bom, eu quebrei a cabeça e não consegui resolver, por isso estou recorrendo a voces! =)
Eu só imagino que o objeto que meu Java está recebendo do Flex -> BlazeDS -> tenha alguma particularidade, e por isso não é bem interpretado quando eu tento joga-lo no PreparedStatement…mas são só duvidas…se voces souberem como eu resolvo o problema, agradeceria qualquer dica, opnião, etc…
Pra quem ficou com preguiça de olhar o link do Horochovec, aqui vão as classes, e xmls necessários:
FlexDuck.mxml
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx">
<fx:Script>
<![CDATA[
import br.com.horochovec.model.Contato;
import mx.collections.ArrayCollection;
import mx.controls.Alert;
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;
[Bindable]
public var contato : Contato = new Contato();
[Bindable]
public var listContato : ArrayCollection = new ArrayCollection();
/**
* Metodo para falhas na comunicação
*/
protected function onFault(event:FaultEvent) : void
{
Alert.show('Erro');
}
/**
* Funcao para retorno de cadastro do Contato
*/
protected function onResultAddContatoHandler(event:ResultEvent) : void
{
Alert.show('Adicionado');
}
/**
* Funcao para retorno da lista de contatos
*/
protected function onResultGetListContatoHandler(event:ResultEvent) : void
{
this.listContato = event.result as ArrayCollection;
}
/**
* Evento de click do botão de cadastro
*/
protected function btnCadastroClickHandler(event:MouseEvent):void
{
this.remoteObject.addContato(this.contato);
}
/**
* Evento de click do botão de pesquisa
*/
protected function btnListarClickHandler(event:MouseEvent):void
{
this.remoteObject.getListContato();
}
]]>
</fx:Script>
<fx:Binding source="nome.text" destination="contato.nome" twoWay="true"/>
<fx:Binding source="email.text" destination="contato.email" twoWay="true"/>
<fx:Declarations>
<s:RemoteObject id="remoteObject"
destination="ContatoService"
fault="onFault(event);">
<s:method name="addContato"
result="onResultAddContatoHandler(event);"
fault="onFault(event);" />
<s:method name="getListContato"
result="onResultGetListContatoHandler(event);"
fault="onFault(event);" />
</s:RemoteObject>
</fx:Declarations>
<s:Panel width="400" height="137" title="Cadastro" left="10" top="10">
<s:Button x="55" label="Cadastrar" bottom="10" id="btnCadastro" click="btnCadastroClickHandler(event)"/>
<s:Label x="10" y="16" text="Nome:"/>
<s:Label x="13" y="50" text="Email:"/>
<s:TextInput x="56" y="10" width="332" id="nome"/>
<s:TextInput x="56" y="44" width="332" id="email"/>
</s:Panel>
<s:Panel x="12" y="166" width="400" height="227" title="Pesquisa" left="10">
<mx:DataGrid x="10" y="10" bottom="30" left="5" right="5" top="5" id="grid" dataProvider="{this.listContato}">
<mx:columns>
<mx:DataGridColumn headerText="Nome" dataField="nome"/>
<mx:DataGridColumn headerText="Email" dataField="email"/>
</mx:columns>
</mx:DataGrid>
<s:Button x="-1" y="163" label="Listar todos" left="5" bottom="5" id="btnListar" click="btnListarClickHandler(event)"/>
</s:Panel>
</s:Application>
package br.com.horochovec.model
{
[RemoteClass(alias="br.com.horochovec.model.Contato")]
[Bindable]
public class Contato
{
public var nome : String;
public var email : String;
public function Contato()
{
}
}
}
web.xml //No projeto Java
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>FlexDuck</display-name>
<welcome-file-list>
<welcome-file>FlexDuck.html</welcome-file>
</welcome-file-list>
<!-- Http Flex Session attribute and binding listener support -->
<listener>
<listener-class>flex.messaging.HttpFlexSession</listener-class>
</listener>
<!-- MessageBroker Servlet -->
<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>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>MessageBrokerServlet</servlet-name>
<url-pattern>/messagebroker/*</url-pattern>
</servlet-mapping>
</web-app>
remoting-config.xml //No projeto Java
<?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="ContatoService">
<properties>
<source>br.com.horochovec.service.ContatoService</source>
</properties>
</destination>
</service>