Flex - Passar Objeto Java para Flex

14 respostas
L

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;
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();
		}
		
	}

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!

14 Respostas

F

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

L

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!!!

F

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

L

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

[]'s

F

Qq coisa estamos aí.

L

éééé 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

[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;

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!!!

F

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

L

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
@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;
	}
	}
E Esta aqui é a amk_contatos.as
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;
		}

}

}

Será que estou especificando alguma coisa errada???

Obrigado mais uma vez, Falou

F

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

L

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

F

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

L

(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

L

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 ???

R

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…

Criado 6 de junho de 2011
Ultima resposta 20 de ago. de 2012
Respostas 14
Participantes 3