List no XStream dando erro de conversão

Olá amigos, tenho a seguinte estrutura de xml:

<PD_Programa> <Empresas> <Empresa> <TipoEmpresa>P</TipoEmpresa> <CodEmpresa>0048</CodEmpresa> </Empresa> </Empresas> <InicioVigencia>201207</InicioVigencia> <FimVigencia>201207</FimVigencia> <Temas> <Tema> <CodTema>EE</CodTema> <JustificativasTema></JustificativasTema> <ObjetivosTema></ObjetivosTema> </Tema> </Temas> </PD_Programa>

E tenho a estrutura na classe que criei só para o uso dessa leitura de xml:

private Programa pd_programa = new Programa(); private List<EmpresaTO> empresas; private EmpresaTO empresa = new EmpresaTO(); private String inicioVigencia; private String fimVigencia; private List<Tema> temas = new ArrayList<Tema>();

Estou com problema em carregar os objetos que são Listas: Empresas e Temas.

Alguém tem algum modo de ler isso? Já procurei no proprio site do xstream e lá tem a função addImplicitCollection, mas fica dizendo que não está setada a coleção.

Abaixo é como monto a leitura do xml:

[code]XStream x = new XStream(new DomDriver(“ISO-8859-1”));
x.setMode(XStream.NO_REFERENCES);

			try{
				File f = new File(caminhoArquivo+xml.getArquivo());
				FileInputStream input = new FileInputStream(f);
				x.alias("PD_Programa", PlanoEstrategicoDetalharXmlTO.class);
				x.alias("Empresas", List.class);
				x.alias("Empresa", PlanoEstrategicoDetalharXmlTO.class);
				ObjectInputStream in = x.createObjectInputStream(input);
				System.out.println( in.readObject());
			}catch(Exception e){
				e.printStackTrace();
			}[/code]

Cara,

pq vc nao usa anotação para fazer isso, é bem mais traquilo.

posta o erro que está acontecendo.

t+

com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter$UnknownFieldException: No such field br.gov.chesf.ped.negocio.componente.planoestrategico.to.PlanoEstrategicoDetalharXmlTO.TipoEmpresa ---- Debugging information ---- field : TipoEmpresa class : br.gov.chesf.ped.negocio.componente.planoestrategico.to.PlanoEstrategicoDetalharXmlTO required-type : br.gov.chesf.ped.negocio.componente.planoestrategico.to.PlanoEstrategicoDetalharXmlTO converter-type : com.thoughtworks.xstream.converters.reflection.ReflectionConverter class[1] : java.util.ArrayList converter-type[1] : com.thoughtworks.xstream.converters.collections.CollectionConverter version : null -------------------------------

Annotations? Cuma?

da uma lida ai, http://xstream.codehaus.org/annotations-tutorial.html

Massa, estava vendo mas surgiu uma dúvida que acho que não foi mostrada lá.

Por exemplo, eu tenho a lista de empresas, que cada elemento tem 2 atributos.

Como faço para mapear cada um, pois lá tem o exemplo para mapear um, tipo:


@XStreamImplicit(itemFieldName="tipoEmpresa")
private List<EmpresaTO> empresas;

Como colocar para ele mapear o codEmpresa?

entao cara,

vc nao vai ter @XStreamImplicit(itemFieldName=“tipoEmpresa”) na sua classe Programa

vc vai ter esse atributos na classe empresato, se os atributos forem o msm nome q no xml, vc nao precisa colocar nada, mas se for diferente vc vai precisa da anotacao alias para trocar o nome do atributo

Então amigo, os atributos na classe EmpresaTO tem o mesmo nome que é gerado no nó do XML:

Olha como ficou a classe anotada:

[code]@XStreamAlias(“ped”)
public class PlanoEstrategicoDetalharXmlTO {

@XStreamAlias("pd_programa")
private Programa pd_programa = new Programa();
@XStreamImplicit
private List<EmpresaTO> empresas;
@XStreamAlias("inicioVigencia")
private String inicioVigencia;
@XStreamAlias("fimVigencia")
private String fimVigencia;
@XStreamImplicit
private List<Tema> temas = new ArrayList<Tema>();[/code]

E a minha chamada dela:

[code]XStream x = new XStream(new DomDriver(“ISO-8859-1”));
x.processAnnotations(PlanoEstrategicoDetalharXmlTO.class);

            try{  
                File f = new File(caminhoArquivo+xml.getArquivo());  
                FileInputStream input = new FileInputStream(f);  
                ObjectInputStream in = x.createObjectInputStream(input); 
                System.out.println(in.readObject());
            }catch(Exception e){  
                e.printStackTrace();  
            }  [/code]

E agora ele mostra:

com.thoughtworks.xstream.mapper.CannotResolveClassException: PD_Programa

Lembrando que o que quero fazer é: ler um xml de um lugar tal, e transforma-lo em objeto.

cara,

acho que vc nao entendeu o intuito do xstream, ele trabalha com orientacao de objeto, vc vai ter uma classe que representa a tag do seu xml, PD_Programa e essa classe por sua vez possui uma lista de empresas, assim por diante

Entendi sim amigo, vê comigo se não está de uma forma orientada a objetos:

Essa é minha estrutura do xml:

<?xml version="1.0" encoding="ISO88591"?> <PED Tipo="PROGRAMA" CodigoEmpresa="0048"> <PD_Programa> <Empresas> <Empresa> <TipoEmpresa>P</TipoEmpresa> <CodEmpresa>0048</CodEmpresa> </Empresa> </Empresas> <InicioVigencia>201207</InicioVigencia> <FimVigencia>201207</FimVigencia> <Temas> <Tema> <CodTema>EE</CodTema> <JustificativasTema></JustificativasTema> <ObjetivosTema></ObjetivosTema> </Tema> </Temas> </PD_Programa> </PED>

Veja que tenho a raiz que é a minha classe postada anteriormente, e dentro dela tenho a lista de empresas, a lista de temas, inicioVigencia e fimVigencia que são um atributos da classe que possui as listas.

Se olhar direitinho estão montados corretamente.

Ainda fiz melhor, vê só:

Essa é a classe pai agora:

[code]@XStreamAlias(“ped”)
public class PlanoEstrategicoDetalharXmlTO {

@XStreamAlias("PD_Programa")
private ProgramaPlanoEstrategicoTO pd_programa;

public ProgramaPlanoEstrategicoTO getPd_programa() {
	return pd_programa;
}

public void setPd_programa(ProgramaPlanoEstrategicoTO pdPrograma) {
	pd_programa = pdPrograma;
}[/code]

E o atributo “pd_programa” é do tipo ProgramaPlanoEstrategicoTO :

[code]@XStreamAlias(“PD_Programa”)
public class ProgramaPlanoEstrategicoTO {

@XStreamImplicit
private List<EmpresaTO> empresas;
@XStreamAlias("inicioVigencia")
private String inicioVigencia;
@XStreamAlias("fimVigencia")
private String fimVigencia;
@XStreamImplicit
private List<Tema> temas;[/code]

E dai o danado agora mostrou um erro mais descente:

com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter$UnknownFieldException: No such field br.gov.chesf.ped.negocio.componente.planoestrategico.to.ProgramaPlanoEstrategicoTO.Empresas ---- Debugging information ---- field : Empresas class : br.gov.chesf.ped.negocio.componente.planoestrategico.to.ProgramaPlanoEstrategicoTO required-type : br.gov.chesf.ped.negocio.componente.planoestrategico.to.ProgramaPlanoEstrategicoTO converter-type : com.thoughtworks.xstream.converters.reflection.ReflectionConverter path : /PD_Programa/Empresas version : null -------------------------------

agora ta correto… rsrs

no seu xml a tag PED, vc tem q criar dois atributos e vai ser anotada como stream atributte,
vc nao vai ter a anotacao xstream implicit.

e manda o erro q ta acorrendo agora

Amigo, não creio ter entendido sua explicação:

Tipo vc disse para eu criar 2 atributos ( ONDE? Na classe pai ou na do tipo ProgramaPlanoEstrategicoTO? ), quais atributos?

cara,

uma dica para trabalhar com xstream seria fazer o servico ao contrario, criar uma estrutura de teste de objetos java e ve se o resultado do xml é o msm que vc espera.
vai ter ajudar.

T+

Isso já foi feito numa classe Main para testes, e o que estou querendo segue correto entre a estrutura.

Sobre o ultimo erro que postei, pelo que entendi, na minha classe que está anotada como (“ped”) ele não encontra o atributo Empresas que foi colocado em uma nova classe que é do tipo ProgramaPlanoEstrategico que está definida com anotação do xmlAlias (“pd_programa”).

Adicionei o atributo e ainda assim ele não o encontra.

cara,

o resultado que vc obteve no teste é o msm q seu xml q vc obtem?

sua classe deve ta assim


@XStreamAlias("PED")  
public class PlanoEstrategicoDetalharXmlTO {  
  
    @XStreamAlias("PD_Programa")  
    private ProgramaPlanoEstrategicoTO pd_programa;  
  
    public ProgramaPlanoEstrategicoTO getPd_programa() {  
        return pd_programa;  
    }  
  
    public void setPd_programa(ProgramaPlanoEstrategicoTO pdPrograma) {  
        pd_programa = pdPrograma;  
    } 

@XStreamAlias("PD_Programa")  
public class ProgramaPlanoEstrategicoTO { 
@XStreamAlias("Empresas")
	private List<EmpresaTO> empresas;
	@XStreamAlias("InicioVigencia")
	private String inicioVigencia;
	@XStreamAlias("FimVigencia")
	private String fimVigencia;
	@XStreamAlias("Temas")
	private List<Tema> temas;