ArrayCollection do Flex para o Java [RESOLVIDO]

8 respostas
fmachado.dev

boa Tarde.
eu estou com um problema ao passar um arrayCollection do flex para o java.

primeiro vai os codes das classes
No java

@FlexClass(classType=FlexClass.FlexClassType.RemoteObject)
public class ObraProxy extends Proxy<Obra>{

    private long id;
    private Obra obra;
    private String nome;
    private LocalObra local;
    private List<SiteProxy> sites;
    private List<PerfilObraProxy> usuarios;
    private List<EquipamentoProxy> equipamentos;
    
    private TipoObraProxy tipo;
    private EmpresaProxy empresa;


    private boolean ativo;

    public ObraProxy() {
        this.obra=new Obra();
    }

    public ObraProxy(Obra t){
        super(t);
    }
    //getters e setters

}

no flex

[Bindable]
    [RemoteClass(alias="xx.ObraProxy")]
	public class Obra extends Vo
	{
		public var id:int;
		public var nome:String;
		public var ativo:Boolean;		
		public var empresa:Empresa;
		public var tipo: TipoObra;
		
		[ArrayElementType("xxx.Site")]
		public var sites:ArrayCollection;
		
		[ArrayElementType("xxx.Equipamento")]
		public var equipamentos:ArrayCollection;	
		
		[ArrayElementType("xxx.PefilObra")]
		public var usuarios:ArrayCollection;
				
		public function Obra()		
		{
				
		}

	}
}

No flex eu tenho uma tela para cadastrar essa obra, coloco um nome, um tipo etc…
fazendo o debug no flex vejo que foi populado os arraycollections corretamente
porém quando eu mando para o java, os arrays ficam nulos, porém as demais variaveis ficam preenchidas corretamente
alguém tem alguma idéia
estou utilizando java+flex+blazeds

8 Respostas

B

Boa tarde fmachado.dev,

Você já tentou inicializar os arraycollections na sua classe Flex?

public var equipamentos:ArrayCollection = new ArrayCollection();

Att,

Guilherme Bernert

fmachado.dev

Já sim…
mas eu resolvi dessa maneira, converti minha coleção, só não atualizei aqui porque havia esquecido que postei…
Mas valeu pela resposta, eu vou colocar o code aqui depois da solução.

At.
Felipe Machado.

fmachado.dev

bom, como prometido aqui vai a solução para blazeds (não sei se nos outros vai ser dessa maneira)

no flex

public class Obra extends Vo
	{
		public var id:Number;
		public var nome:String;
		public var ativo:Boolean;		
		public var empresa:Empresa;
		public var tipo: TipoObra;
		
		
		[ArrayElementType("XXX.Site")]
		public var sitesCollections:ArrayCollection;
		
		[ArrayElementType("XXX.Equipamento")]
		public var equipamentosCollections:ArrayCollection;	
		
		[ArrayElementType("XXX.PefilObra")]
		public var usuariosCollections:ArrayCollection;
				
		public function Obra()
		{
				
		}

depois no java

@FlexClass(classType = FlexClass.FlexClassType.RemoteObject)
public class ObraProxy extends Proxy<Obra> {

    private long id;
    private Obra obra;
    private String nome;
    private List<SiteProxy> sites;
    private List<PerfilObraProxy> usuarios;
    private List<EquipamentoProxy> equipamentos;
    private TipoObraProxy tipo;
    private EmpresaProxy empresa;
    private ArrayCollection usuariosCollections;
    private ArrayCollection equipamentosCollections;
    private ArrayCollection sitesCollections;
    private boolean ativo;

    public ObraProxy() {
        this.obra = new Obra();
    }

    public ObraProxy(Obra t) {
        super(t);
    }

    @Override
    public void copy(Obra t) {        
        this.setId(t.getId());
        this.setNome(t.getNome()); 
        this.setAtivo(t.isAtivo());
        this.setTipo(new TipoObraProxy(t.getTipo()));
        this.setUsuariosCollections((ArrayCollection) ConverteColecao.getInstance().converteToCollections(t.getUsuarios() == null ? null : t.getUsuarios(), PerfilObraProxy.class));
        this.setSitesCollections((ArrayCollection) ConverteColecao.getInstance().converteToCollections(t.getSites() == null ? null : t.getSites(), SiteProxy.class));
        this.setEquipamentosCollections((ArrayCollection) ConverteColecao.getInstance().converteToCollections(t.getEquipamentos() == null ? null : t.getEquipamentos(), EquipamentoProxy.class));
        this.setEmpresa(t.getEmpresa() == null ? null : new EmpresaProxy(t.getEmpresa()));
    }

    @Override
    public Obra copy() {
        List<Site> auxSites = (List<Site>) ConverteColecao.getInstance().converteArrayCollection(getSitesCollections(), Site.class);
        List<PerfilObra> auxUsuarios = (List<PerfilObra>) ConverteColecao.getInstance().converteArrayCollection(getUsuariosCollections(), PerfilObra.class);
        List<Equipamento> auxEquipamentos = (List<Equipamento>) ConverteColecao.getInstance().converteArrayCollection(getEquipamentosCollections(), Equipamento.class);
        this.obra.setId(this.id);
        this.obra.setAtivo(true);
        this.obra.setNome(this.nome);
        this.obra.setTipo(this.tipo == null ? null : this.tipo.copy());
        this.obra.setEmpresa(this.empresa == null ? null : this.empresa.copy());
        this.obra.setUsuarios(auxUsuarios);
        this.obra.setSites(auxSites);
        this.obra.setEquipamentos(auxEquipamentos);
        return this.obra;
    }


//setters e getters aqui

depois eu tenho um método para converter

public List<?> converteArrayCollection (ArrayCollection arrayFlex, Class <?> classe){
        List<Object> retorno = new ArrayList<Object>();
        try {
            
                 for (Object item:arrayFlex){
                    Object itemNovo = classe.newInstance();
                    itemNovo=((Proxy)item).copy();
                    retorno.add(itemNovo);
                }
            
        }catch(Exception ex){
            //System.out.println("erro na conversão da coleção");
        }
        return retorno;
    }

Uma breve explicação:
No Java eu tenho classes proxys que fazem cópias das entidades (classes do banco) porque java+flex+blazeds tem um problema com lazy load, que quando voce “solicita” um objeto ele traz todos os objetos relacionados com o solicitado, mesmo que você não precise,
por exemplo tenho uma entidade usuario, uma obra e uma equipamentos.
quando vou fazer o login e solicito o objeto usuario ele traz (graças ao blazeds, porque, se eu não me engano, o graniteds já resolveu esse problema) os objetos obra (que está relacionado ao usuario) e equipamentos (que está relacionado as obras).
Quando envio os ArrayCollections para o java, converto eles para arraylist e envio para o meu objeto entidade. Depois salvo ele no banco de dados pelo hibernate normal.
Bom, se alguém tiver alguma duvida só gritar.

pintofree

ola, so um detalhe esta classe ArrayCollection do Java vc tirou de onde??

fmachado.dev

Essa classe está no pacote flex.messaging.io do blazeds

pintofree

hum Bem bacana desconhecia esta classe, amanha vou precisar criar uma POG onde vo passar o ArrayCollection do Flex pro java, e ia bater a cabeça sobre isso

G

fmachado.dev:
bom, como prometido aqui vai a solução para blazeds (não sei se nos outros vai ser dessa maneira)

no flex

public class Obra extends Vo
	{
		public var id:Number;
		public var nome:String;
		public var ativo:Boolean;		
		public var empresa:Empresa;
		public var tipo: TipoObra;
		
		
		[ArrayElementType("XXX.Site")]
		public var sitesCollections:ArrayCollection;
		
		[ArrayElementType("XXX.Equipamento")]
		public var equipamentosCollections:ArrayCollection;	
		
		[ArrayElementType("XXX.PefilObra")]
		public var usuariosCollections:ArrayCollection;
				
		public function Obra()
		{
				
		}

depois no java

@FlexClass(classType = FlexClass.FlexClassType.RemoteObject)
public class ObraProxy extends Proxy<Obra> {

    private long id;
    private Obra obra;
    private String nome;
    private List<SiteProxy> sites;
    private List<PerfilObraProxy> usuarios;
    private List<EquipamentoProxy> equipamentos;
    private TipoObraProxy tipo;
    private EmpresaProxy empresa;
    private ArrayCollection usuariosCollections;
    private ArrayCollection equipamentosCollections;
    private ArrayCollection sitesCollections;
    private boolean ativo;

    public ObraProxy() {
        this.obra = new Obra();
    }

    public ObraProxy(Obra t) {
        super(t);
    }

    @Override
    public void copy(Obra t) {        
        this.setId(t.getId());
        this.setNome(t.getNome()); 
        this.setAtivo(t.isAtivo());
        this.setTipo(new TipoObraProxy(t.getTipo()));
        this.setUsuariosCollections((ArrayCollection) ConverteColecao.getInstance().converteToCollections(t.getUsuarios() == null ? null : t.getUsuarios(), PerfilObraProxy.class));
        this.setSitesCollections((ArrayCollection) ConverteColecao.getInstance().converteToCollections(t.getSites() == null ? null : t.getSites(), SiteProxy.class));
        this.setEquipamentosCollections((ArrayCollection) ConverteColecao.getInstance().converteToCollections(t.getEquipamentos() == null ? null : t.getEquipamentos(), EquipamentoProxy.class));
        this.setEmpresa(t.getEmpresa() == null ? null : new EmpresaProxy(t.getEmpresa()));
    }

    @Override
    public Obra copy() {
        List<Site> auxSites = (List<Site>) ConverteColecao.getInstance().converteArrayCollection(getSitesCollections(), Site.class);
        List<PerfilObra> auxUsuarios = (List<PerfilObra>) ConverteColecao.getInstance().converteArrayCollection(getUsuariosCollections(), PerfilObra.class);
        List<Equipamento> auxEquipamentos = (List<Equipamento>) ConverteColecao.getInstance().converteArrayCollection(getEquipamentosCollections(), Equipamento.class);
        this.obra.setId(this.id);
        this.obra.setAtivo(true);
        this.obra.setNome(this.nome);
        this.obra.setTipo(this.tipo == null ? null : this.tipo.copy());
        this.obra.setEmpresa(this.empresa == null ? null : this.empresa.copy());
        this.obra.setUsuarios(auxUsuarios);
        this.obra.setSites(auxSites);
        this.obra.setEquipamentos(auxEquipamentos);
        return this.obra;
    }


//setters e getters aqui

depois eu tenho um método para converter

public List<?> converteArrayCollection (ArrayCollection arrayFlex, Class <?> classe){
        List<Object> retorno = new ArrayList<Object>();
        try {
            
                 for (Object item:arrayFlex){
                    Object itemNovo = classe.newInstance();
                    itemNovo=((Proxy)item).copy();
                    retorno.add(itemNovo);
                }
            
        }catch(Exception ex){
            //System.out.println("erro na conversão da coleção");
        }
        return retorno;
    }

Uma breve explicação:
No Java eu tenho classes proxys que fazem cópias das entidades (classes do banco) porque java+flex+blazeds tem um problema com lazy load, que quando voce “solicita” um objeto ele traz todos os objetos relacionados com o solicitado, mesmo que você não precise,
por exemplo tenho uma entidade usuario, uma obra e uma equipamentos.
quando vou fazer o login e solicito o objeto usuario ele traz (graças ao blazeds, porque, se eu não me engano, o graniteds já resolveu esse problema) os objetos obra (que está relacionado ao usuario) e equipamentos (que está relacionado as obras).
Quando envio os ArrayCollections para o java, converto eles para arraylist e envio para o meu objeto entidade. Depois salvo ele no banco de dados pelo hibernate normal.
Bom, se alguém tiver alguma duvida só gritar.

eu estou precisando mandar uma string do flex pro java e estou com o mesmo problema q vc estava, e, creio, q essa solucao pode ser a minha tambem… mas, estou com alguma duvidas pra implementar o seu codigo no meu projeto:

  1. qdo vc diz que no flex cria o “public class Obra extends Vo”, eh um novo ActionScrip Class no flex ? (ser for isso, ate esta ok)

  2. mas a fuvida maior eh depois no java:
    o java, no @FlexClass(classType = FlexClass.FlexClassType.RemoteObject) faz eu criar um nova classe no java…

lendo o seu topico, pensei q ligaria com o 2) com o 1)…

poderia (ou alguem), por favor, me orientar ?

desde ja agradeco: MUITO OBRIGADO !

Gilberto

fmachado.dev

Cara, eu estava meio ausente ao GUJ, mas se você ainda precisar de ajuda com JAVA e FLEX pode me mandar e-mail para [email removido] ou [email removido], ou, se preferir, pode postar aqui que eu voltei a frequentar o fórum.

Abraços

Criado 7 de junho de 2010
Ultima resposta 15 de jul. de 2011
Respostas 8
Participantes 4