List no XStream dando erro de conversão

15 respostas
D

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:

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

15 Respostas

A

Cara,

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

posta o erro que está acontecendo.

t+

D

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?

A

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

D

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?

A

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

D

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

Olha como ficou a classe anotada:

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

E a minha chamada dela:

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

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.

A

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

D

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.

D

Ainda fiz melhor, vê só:

Essa é a classe pai agora:

@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;
	}

E o atributo "pd_programa" é do tipo ProgramaPlanoEstrategicoTO :

@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;
D

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

A

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

D

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?

A

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+

D

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.

A

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;
Criado 6 de novembro de 2012
Ultima resposta 6 de nov. de 2012
Respostas 15
Participantes 2