Flex - Passar Objeto Java para Flex

Bom Dia!

Seguinte galera estou encontrando dificuldades no momento de exibir os dados de um determinado objeto que vem da classe Java para o Flex;

Minha intenção é ao logar com um usuario um label deverá exibir o atributo nome desse objeto, e nesta sessão todos as requisições e consulta pertencerão apenas a esse determinado usuario;

a parte de Login funciona normalmente, o problema realmente está no momento de manipular estes dados;

Esta é a parte onde passo o objeto do Java para o Flex;

[code]
public amk_contato validarLogin(String usuario, String senha) throws Exception
{
amk_contato usuarioLogado = contatosDAO.validarLogin(usuario, senha);

	try {
		 
		if( usuarioLogado == null )
			throw new UsuarioNaoExisteException("Não foi possível se conectar, pois o usuário ou a senha está incorreto.");
		
		else {
			
			if( utils.isUsuarioLogado( usuarioLogado.getContato_cd() ) )
			{
				//usuário já está logado
				throw new UsuarioJaLogadoException("Já existe alguém logado com esse usuário");
				
			} else {
		 
				//usuário logado com sucesso
				//registro atributos na sessão
				FlexContext.getFlexClient().setAttribute("usuario", usuario);
		 
				//registro esse usuário na lista dos usuários logados
				UsuarioUtils.usuariosLogados.put(usuarioLogado.getContato_cd(), "nomeDaEmpresa");
		
				//retorno o objeto inteiro desse usuário para ser armazenado no Flex para consultas posteriores
				return usuarioLogado;
		 
			}
		}
	} catch(UsuarioNaoExisteException e) {
		
		throw new UsuarioNaoExisteException(e.getMensagem());
		
	} catch(UsuarioJaLogadoException e) {
	
		throw new UsuarioJaLogadoException(e.getMensagem());
		
	} catch(Exception e ) {
		e.printStackTrace();
		throw new Exception();
	}
	
}[/code]

Esta é a parte onde recebo o retorno do Java;


public function logar(event:ResultEvent):void
			{
				var usuario:amk_contatos = new amk_contatos();
				usuario = event.result as amk_contatos;
			
				fechar();
				
			}

Para o objeto criei uma classe em AS replicando a classe em Java;


[Bindable]  
	[RemoteClass(alias="br.com.intec.mobile.persitence.amk_contatos")]  
	public class amk_contatos  
	{  
		private var contato_cd:int;
		private var contato_empresa:String;
		private var contato_usuario:String;
		private var contato_senha:String;
		private var contato_nome:String;
		private var contato_cnpj:String;
		private var contato_tipo:String;
		private var contato_fiju:String;
		private var contato_serie:String;

//Getters e Setters
}

quando faço um Alert consigo exibir no alert os dados que estou tentanto trazer, porém ao tentar exibir o nome do usuario na proxima tela ao Fechar o Login, nada acontece, ou seja alguma coisa não está deixando passar do login para aplicação, alguém pode me indicar um método, ou maneira de realizar esse procedimento, referências e tutoriais também ajudam.

Obrigado a todos pela atenção!

Leandro,
Este objeto só existe dentro do teu método q recebe o retorno do server, para vc deixar disponível para toda a aplicação recomendo colocar como atributo de uma classe Singleto: http://fabiophx.blogspot.com/2009/05/metodo-construtor-singleton.html

[]s

Fabio,

Me perdoe, a ignorância mas estou iniciando no desenvolvimento de sistemas, já havia ouvido falar sobre esse Design Pattern Singleton, porém nunca houve a necessidade de usa-lo;

Entendi qual a finalidade do uso do Singleton, porém, ainda fiquei com duvidas na forma de como aplica-lo.

Você recomendou que eu usasse como atributo de uma classe Singleton, Esta classe deverá ser criada em Java e Flex? E qual o momento que devo chamar o objeto após receber o seu retorno do Server???

Enquanto espero sua dica, vou olhando melhor o funcionamento do Singleton, Obrigado!!!

Leandro,
Essa classe singleton vc terá só no lado flex.
Singleton é uma classe q pode ter somente uma instância dela e vc obtém a referência via getInstance e não via new (Classe Calendar do Java).
Vamos por etapas:
1. Tela de login pedindo usuário e senha.
2. Requisição de login para o server.
3. Se sucesso vc irá receber um objeto com os dados do usuário logado. Teu método logar, ali vc criou uma variável usuario ela só irá “viver” dentro daquele método.
4. Colocar a variável usuário no Singleton e fechar a janela de login.
5. Via classe singleton vc poderá acessar os dados do usuário logado em qq parte do sistema.

[]s

Maravilha Fabio, Entendido o funcionamento, agora vou partir para implementação, muito Obrigado pela dica!!!

[]'s

Qq coisa estamos aí.

éééé galera, e depois de um dia inteiro tentanto exibir ao menos um Alert com algum dado qualquer do usuario, não consegui simplesmente nada…

Pior que não sei o porque em todos tutoriais está da forma que venho tentando mas, realmente nada acontece;

Me ajudem ae, vou revisar uma das minhas tentativas;

Classe amk_contatos.java


@Entity
public class amk_contato {
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	private int contato_cd;
	private String contato_empresa;
	private String contato_usuario;
	private String contato_senha;
	private String contato_nome;
	private String contato_cnpj;
	private byte[] contato_maisvr;
	private byte[] contato_menosvr;
	private String contato_tipo;
	private String contato_fiju;
	private String contato_serie;
	private Timestamp contato_dt_atualizado;
	private Timestamp contato_dt_cadastro;
	
	 public amk_contato() {
		 super();
	}

Classe amk_contatos.as

[code]
[Bindable]
[RemoteClass(alias=“br.com.intec.mobile.persitence.amk_contatos”)]
public class amk_contatos
{
private var contato_cd:int;
private var contato_empresa:String;
private var contato_usuario:String;
private var contato_senha:String;
private var contato_nome:String;
private var contato_cnpj:String;
private var contato_maisvr:ByteArray;
private var contato_menosvr:ByteArray;
private var contato_tipo:String;
private var contato_fiju:String;
private var contato_serie:String;
private var contato_dt_atualizado:Timer;
private var contato_dt_cadastro:Timer;

	[/code]

Método que faz a busca pelo Login e Senha Controller.java


	public amk_contato validarLogin(String usuario, String senha) throws Exception
	{
		amk_contato usuarioLogado = contatosDAO.validarLogin(usuario, senha);
		
		try {
			 
			if( usuarioLogado == null )
				throw new UsuarioNaoExisteException("Não foi possível se conectar, pois o usuário ou a senha está incorreto.");
			
			else {
				
				if( utils.isUsuarioLogado( usuarioLogado.getContato_cd() ) )
				{
					//usuário já está logado
					throw new UsuarioJaLogadoException("Já existe alguém logado com esse usuário");
					
				} else {
			 
					//usuário logado com sucesso
					//registro atributos na sessão
					FlexContext.getFlexClient().setAttribute("usuario", usuario);
			 
					//registro esse usuário na lista dos usuários logados
					UsuarioUtils.usuariosLogados.put(usuarioLogado.getContato_cd(), "nomeDaEmpresa");
					String string = usuarioLogado.getContato_nome();
					System.out.println(string);
					//retorno o objeto inteiro desse usuário para ser armazenado no Flex para consultas posteriores
					return usuarioLogado;
			 
				}
			}
		} catch(UsuarioNaoExisteException e) {
			
			throw new UsuarioNaoExisteException(e.getMensagem());
			
		} catch(UsuarioJaLogadoException e) {
		
			throw new UsuarioJaLogadoException(e.getMensagem());
			
		} catch(Exception e ) {
			e.printStackTrace();
			throw new Exception();
		}
		
	}

E pra Finalizar login.as

[Bindable]
			public var result:amk_contatos = new amk_contatos();
			
			public function logar(event:ResultEvent):void
			{  
				result = event.result as amk_contatos;
				var nome = result.contato_nome;
				Alert.show("Bem Vindo"+ nome);
				 
			}

Onde estou errando???

Até o Retorno do Java Funciona normalmente, depois não vai nem a custo de pancada… alguém consegue enchergar onde estou vacilando???

Valeu Galera!!!

Leandro,
Perguntas:
1. Tuas classes (amk_contato) pojo Java e Flex possuem métodos get e set públicos? Para essa transferência funcionar 100% é necessário seguir o padrão java bean, um construtor público sem parâmetros e atributos públicos ou métodos get e set públicos.
2. O teu alert mostra corretamente?

[]s

Fala Fabio, pois é cara, o pior é que não me esqueci desses fatores eles realmente estão especificados, talvez a classe pojo do Flex esteja com alguma deficiencia, porém não sei julgar, por não ser um profundo conhecedor de Flex, e como não acusou nenhum erro eu segui daquela forma, vou postar as classes aqui, se puder me dar mais uma força eu ficarei grato Fabio;

Sobre o Alert, eu acho estranho, pois ele nem aparece, ou seja, nem chega nele, me parece que qualquer coisa que eu coloque abaixo da linha result = event.result as amk_contatos; não funciona…

Esta é a amk_contatos.java

[code]@Entity
public class amk_contato {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int contato_cd;
private String contato_empresa;
private String contato_usuario;
private String contato_senha;
private String contato_nome;
private String contato_cnpj;
private byte[] contato_maisvr;
private byte[] contato_menosvr;
private String contato_tipo;
private String contato_fiju;
private String contato_serie;
private Timestamp contato_dt_atualizado;
private Timestamp contato_dt_cadastro;

 public amk_contato() {
	 super();
}

public int getContato_cd() {
	return contato_cd;
}
public void setContato_cd(int contatoCd) {
	contato_cd = contatoCd;
}
public String getContato_empresa() {
	return contato_empresa;
}
public void setContato_empresa(String contatoEmpresa) {
	contato_empresa = contatoEmpresa;
}
public String getContato_usuario() {
	return contato_usuario;
}
public void setContato_usuario(String contatoUsuario) {
	contato_usuario = contatoUsuario;
}
public String getContato_senha() {
	return contato_senha;
}
public void setContato_senha(String contatoSenha) {
	contato_senha = contatoSenha;
}
public String getContato_nome() {
	return contato_nome;
}
public void setContato_nome(String contatoNome) {
	contato_nome = contatoNome;
}
public String getContato_cnpj() {
	return contato_cnpj;
}
public void setContato_cnpj(String contatoCnpj) {
	contato_cnpj = contatoCnpj;
}
public byte[] getContato_maisvr() {
	return contato_maisvr;
}
public void setContato_maisvr(byte[] contatoMaisvr) {
	contato_maisvr = contatoMaisvr;
}
public byte[] getContato_menosvr() {
	return contato_menosvr;
}
public void setContato_menosvr(byte[] contatoMenosvr) {
	contato_menosvr = contatoMenosvr;
}
public String getContato_tipo() {
	return contato_tipo;
}
public void setContato_tipo(String contatoTipo) {
	contato_tipo = contatoTipo;
}
public String getContato_fiju() {
	return contato_fiju;
}
public void setContato_fiju(String contatoFiju) {
	contato_fiju = contatoFiju;
}
public String getContato_serie() {
	return contato_serie;
}
public void setContato_serie(String contatoSerie) {
	contato_serie = contatoSerie;
}

public Timestamp getContato_dt_atualizado() {
	return contato_dt_atualizado;
}
public void setContato_dt_atualizado(Timestamp contatoDtAtualizado) {
	contato_dt_atualizado = contatoDtAtualizado;
}
public Timestamp getContato_dt_cadastro() {
	return contato_dt_cadastro;
}
public void setContato_dt_cadastro(Timestamp contatoDtCadastro) {
	contato_dt_cadastro = contatoDtCadastro;
}
}[/code]

E Esta aqui é a amk_contatos.as

[code]

package metodos
{
import flash.utils.ByteArray;
import flash.utils.Timer;

[Bindable]  
[RemoteClass(alias="br.com.intec.mobile.persitence.amk_contatos")]  
public class amk_contatos  
{  
	
	private var contato_cd:int;
	private var contato_empresa:String;
	private var contato_usuario:String;
	private var contato_senha:String;
	private var contato_nome:String;
	private var contato_cnpj:String;
	private var contato_maisvr:ByteArray;
	private var contato_menosvr:ByteArray;
	private var contato_tipo:String;
	private var contato_fiju:String;
	private var contato_serie:String;
	private var contato_dt_atualizado:Timer;
	private var contato_dt_cadastrado:Timer;
	
	
	public function amk_contatos(){
		trace('A Classe amk_contatos está instanciada corretamente');
	}
	
	public function get cd():int{
		return contato_cd;
	}
	
	public function set cd(cdContato:int):void{
		contato_cd = cdContato;
	}
	
	public function get empresa():String{
		return contato_empresa;
	}
	
	public function set empresa(cdEmpresa:String):void{
		contato_empresa = cdEmpresa;
	}
	
	public function get usuario():String{
		return contato_usuario;
	}
	
	public function set usuario(cdUsuario:String):void{
		contato_usuario = cdUsuario;
	}
	
	public function get senha():String{
		return contato_senha;
	}
	
	public function set senha(cdSenha:String):void{
		contato_senha = cdSenha;
	}
	
	public function get nome():String{
		return contato_nome;
	}
	
	public function set nome(cdNome:String):void{
		contato_nome = cdNome;
	}
	
	public function get cnpj():String{
		return contato_cnpj;
	}
	
	public function set cnpj(cdCnpj:String):void{
		contato_cnpj = cdCnpj;
	}
	
	public function get maisvr():ByteArray{
		return contato_maisvr;
	}
	
	public function set maisvr(cdMaisvr:ByteArray):void{
		contato_maisvr = cdMaisvr;
	}
	
	public function get menosvr():ByteArray{
		return contato_menosvr;
	}
	
	public function set menosvr(cdMenosVr:ByteArray):void{
		contato_menosvr = cdMenosVr;
	}
	
	public function get tipo():String{
		return contato_tipo;
	}
	
	public function set tipo(cdTipo:String):void{
		contato_tipo = cdTipo;
	}
	public function get fiju():String{
		return contato_fiju;
	}
	
	public function set fiju(cdFiju:String):void{
		contato_fiju = cdFiju;
	}
	
	public function get atualizado():Timer{
	
		return contato_dt_atualizado;
	}
	
	public function set atualizado(cdAtualizado:Timer):void{
		contato_dt_atualizado= cdAtualizado;
	}
	
	public function get cadastrado():Timer{
		
		return contato_dt_cadastrado;
	}
	
	public function set cadastrado(cdAtualizado:Timer):void{
		contato_dt_cadastrado = cdAtualizado;
	}

}

}[/code]

Será que estou especificando alguma coisa errada???

Obrigado mais uma vez, Falou

Leandro,
O Alert pelo q vi não está rodando, no Java está amk_contato e no Flex está no plural amk_contatos. O RemoteClass aponta para uma classe no plural. Acertando isso e não fucionar coloaque as dívdas aqui.

[]s

Então Fabio, ainda assim não consegui exibir o Alert, mesmo tirando o nome da classe amk_contato do Plural;

o engraçado é que aundo tento exibir apenas o Alert.show(event.message.toString());

Ele exibe os dados normalmente, parece que o problema está na hora de passar os dados pra classe amk_contatos.as

O que vc acha???

[]'s

Leandro,
Se vc fizer Alert.show(ObjectUtil.toString(event.result)) vc verá os dados corretos, mas logo no início vc verá q o objeto é um Object ou ObjectProxy e não o tipo q vc definiu.
Vc precisa registrar a classe via new ou registerClass, para se fazer a relação Java com Flex e vice-versa.
Deixe as classes com o mesmo nome inclusive o RemoteClass. Não funcionando recomendo colocá-las no mesmo pacote, já tive situação de estarem em pacotes diferentes e não tipificarem corretamente.
Não sei se influencia mas a convenção recomenda q classes comecem com maiúscula juntamente com a primeira letra de uma nova palavar na classe.

[]s

(Object)#0
contato_cd = 524
contato_cnpj = (null)
contato_dt_atualizado = Tue Apr 19 00:00:00 GMT-0300 2011
contato_dt_cadastro = (null)
contato_empresa = "1"
contato_fiju = ""
contato_maisvr = (null)
contato_menosvr = (null)
contato_nome = "juliano"
contato_senha = "intec01"
contato_serie = ""
contato_tipo = "Usuario"
contato_usuario = “juliano”

Está e a resposta que o Alert me trouxe.

O registerClass seria pra classe amk_contatos.as ???

Sobre os nomes com maiuscula e minuscula, acredito não que não influenciam em muita coisa, mas conheço os padrões, problema é que o chefe pediu assim, ae tive que acatar né rsrs…

Vou tentar colocar tudo em um pacote, pra ver se está tipificando de forma errada

Estou começando a achar que deve ser alguma bug da minha maquina ou qualquer coisa parecida, ele não funciona de nenhuma maneira que tento.

Já revisei varias e varias vezes, mas não consigo encontrar a solução, Fabio ou alguém tem mais alguma sugestão ???

Alguém possui um exemplo de criação de telas e componentes dinamicamente em flex, a partir do retorno do banco de dados sql?

Preciso criar uma tela, semelhante a uma carteira de vacinação comum, porém não sei como fazer…