XStream: Tem como fazer isso?

10 respostas
le-silva

Estou usando XStream para fazer serialização e deserialização de POJO/XML, e estou com um probleminha.

Este é o XML gerado a partir do meu POJO:

<parametros>
  <tiposFornecedores class="list">
    <string>1</string>
  </tiposFornecedores>
  <localidade>
    <codigoPais>BR</codigoPais>
    <codigoEstado>SP</codigoEstado>
    <codigoCidade>12</codigoCidade>
    <outer-class reference="../.."/>
  </localidade>
  <checkin>01/11/2007</checkin>
  <checkout>01/11/2007</checkout>
  <moeda>R$</moeda>
  <codigoFilialCVC>10</codigoFilialCVC>
  <apartamentos class="list">
    <apartamento>
      <quantidadeAdultos>2</quantidadeAdultos>
      <idadesCriancas class="list">
        <int>5</int>
        <int>5</int>
        <int>9</int>
      </idadesCriancas>
      <outer-class reference="../../.."/>
    </apartamento>
    <apartamento>
      <quantidadeAdultos>1</quantidadeAdultos>
      <idadesCriancas class="list">
        <int>3</int>
      </idadesCriancas>
      <outer-class reference="../../.."/>
    </apartamento>
  </apartamentos>
</parametros>

Meus problemas:

1- Queria nomear as tags de conteúdo das coleções

<idadesCriancas class="list">
    <int>5</int>
    <int>5</int>
    <int>9</int>
</idadesCriancas>

Ao invés de , queria que fosse .

2- Queria omitir a tag , mas acho que ela é requerida por causa das innerclasses que estou usando.

O problema é que a aplicação que vai me enviar um XML não vai saber informar esta tag, porque são desenvolvedores de uma outra equipe.


Considerando a possibilidade quase certa de que o XStream não possibilite resolver esses probleminhas, alguém poderia me sugerir alguma outra API de Java/XML semelhante?

Preciso serializar/deserializar (em XML) alguns objetos que serão enviados como parametro de entrada e recebidos como parametro de saida de algumas stored procedures que trabalham com XML TYPE.

Alguém pode me dar um help?

Desde já… OBRIGADO!

10 Respostas

danieldestro

Web Services???

Senão, use algo como JAXP.

le-silva

Oi danieldestro, beleza?

Cara, é que a empresa que eu trabalho tem um legado de stored procedures num bd ORACLE.

Para padronizar o acesso a este legado, por diversos sistemas (alguns em Java, outros não), foi convencionado que as procs receberam um XML por parametro de entrada e esta retornará um XML como parametro de saída.

JAXP resolveria meu problema?

le-silva

Eu pensei em usar JDOM. Até fiz uns testes.

É simples e tal, mas o problema é que vai dar muito trabalho, porque cada proc PL/SQL tem um formato de XML de entrada/saída diferente da outra.

Então, pra cada proc que eu for executar e pegar o seu retorno, tenho que ter um XML diferente, tanto pra entrada quanto pra saida.

O mundo cruel… :slight_smile:

Pedrosa

Cara você já tentou usar o Xtream dessa maneira?

xstream.setMode(XStream.NO_REFERENCES);

Assim ele não fará nenhuma referência de sua classes.
http://xstream.codehaus.org/graphs.html

le-silva

Pedrosa:
Cara você já tentou usar o Xtream dessa maneira?

xstream.setMode(XStream.NO_REFERENCES);

Assim ele não fará nenhuma referência de sua classes.
http://xstream.codehaus.org/graphs.html

Cara, eu tentei, mas rolou uma exception: com.thoughtworks.xstream.core.TreeMarshaller$CircularReferenceException

mchiareli

É possivel fazer isso com o xstream sim…

Coloca o código da sua classe aqui.

le-silva

Poderia me dizer como? Porque já procurei, procurei, procurei… e nada!

Tks!

le-silva
@XStreamAlias(value="parametros")
public class FunListaFornecedorInput implements PLSQLInputParameter {

	public Collection<String> tiposFornecedores = new ArrayList<String>();
	public Localidade localidade = new Localidade();
	@XStreamConverter(value=SimpleCalendarConverter.class)
	public Calendar checkin;
	@XStreamConverter(value=SimpleCalendarConverter.class)
	public Calendar checkout;
	public String moeda;
	public Long codigoFilialCVC;
	public Collection<Apartamento> apartamentos = new ArrayList<Apartamento>();
	
	/**
	 * Classe Localidade
	 */
	@XStreamAlias(value="localidade")
	public class Localidade {

		public String codigoPais;
		public String codigoEstado;
		public Long   codigoCidade;
	}
	
	/**
	 * Classe Apartamento
	 */
	@XStreamAlias(value="apartamento")
	public class Apartamento {
		
		public Integer quantidadeAdultos;
		public Collection<Integer> idadesCriancas = new ArrayList<Integer>();
	}

	/* (non-Javadoc)
     * @see integration.PLSQLInputParameter#toXML()
     */
    public String toXML() {
		XStreamHelper xstream = new XStreamHelper();
		
		return xstream.marshall(
			this,
			FunListaFornecedorInput.class,
			FunListaFornecedorInput.Apartamento.class,
			FunListaFornecedorInput.Localidade.class
		);
    }
}

Eu sei que innerclasse não é lá uma boa prática, mas foi a única maneira que encontrei de ter menos .java, já que, olha só… pra proc “X”, Apartamento tem os atributos “a” e “b”, mas pra proc “Y”, Apartamento tem os atributos “k” e “m”, por exemplo.

Essas procs são só uns serviços que eu consumo, não são parte da minha aplicação.

Bom, de qualquer forma, taí o código…

Valeu!!!

marciocamurati

Utilizando o alias do XStream não ajudaria ?

http://xstream.codehaus.org/alias-tutorial.html

[]s

le-silva

marciocamurati:
Utilizando o alias do XStream não ajudaria ?

http://xstream.codehaus.org/alias-tutorial.html

[]s

Eu tô usando, nas classes.

Pelo que eu sei, não dá pra usar diferente do que já estou fazendo.

Criado 1 de novembro de 2007
Ultima resposta 1 de nov. de 2007
Respostas 10
Participantes 5