JAXB 2 e listas

10 respostas
luizalbsilva

Olá, pessoal !

Estou com uma dúvida e não estou encontrando documentação pertinente… Estou querendo faer o marshal da seguinte classe:

package org.rhok.banshee.rest;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Shape{
	private List<Point> polygon;
	private String color;

	public List<Point> getPolygon() {
		return polygon;
	}
	
	public void setPolygon(List<Point> polygon) {
		this.polygon = polygon;
	}
	
	public String getColor() {
		return color;
	}
	
	public void setColor(String color) {
		this.color = color;
	}
}

e quero o seguinte resultado:

<?xml version="1.0" encoding="UTF-8"?>
<shape>
    <polygon>
        <point>
             <x>0</x>
             <y>0</y>
        </point>
        <point>
             <x>0</x>
             <y>10</y>
        </point>
        <point>
             <x>10</x>
             <y>0</y>
        </point>
    </polygon>
    <color>red</color>
</shape>

Que anotações devo utilizar? Ou onde posso conseguir tais informações? Rodei um bom tempo pelo google e somente encontrei exemplos mais simples. Nesse formato acima, não teria as tags points,seriam todas polygon. Ah, sim, e ainda tem o fato da posição, gostaria de saber se existem maneiras de controlar isso no JAXB2… ou se devo procuar outro framework :slight_smile:

Muito obrigado,pessal

P.S. Não colokei a classe point, pois somente tem os atributos x e y… achei que, mesmo implicito está bem claro.

Muchas gracias :slight_smile:

10 Respostas

Vmaia
package org.rhok.banshee.rest;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Shape{
        @XmlElement
	private List<Point> polygon;
        @XmlElement
	private String color;

	public List<Point> getPolygon() {
		return polygon;
	}
	
	public void setPolygon(List<Point> polygon) {
		this.polygon = polygon;
	}
	
	public String getColor() {
		return color;
	}
	
	public void setColor(String color) {
		this.color = color;
	}
}

Acredito que faltou o @XmlElement, porem não conheço muito bem essa API. :smiley:

luizalbsilva

Na verdade não é necessário, mas tinha tentado isso tbm… o resultado é o mesmo :(… tbm não tem parametro dentro dessa annotation (XmlElement) para dizer a ordem :frowning:

Vmaia

Mostra os erros que está aparecendo… se der tbm cola ai a outra classe :smiley: .

luizalbsilva

Não aparece erro, só não dá o resultado esperado… fica mais ou menos assim:

<?xml version="1.0" encoding="UTF-8"?>  
<shape>  
   <polygon>  
      <x>0</x>  
      <y>0</y>  
  </polygon>  
   <polygon>  
      <x>0</x>  
      <y>10</y>  
  </polygon>  
   <polygon>  
      <x>10</x>  
      <y>0</y>  
  </polygon>  
  <color>red</color>  
</shape>

é mais uma questão de gosto pessoal, na verdade uma curiosidade para dominar melhor a ferramente… em termos práticos, poderia usar muito bem essa estrutura… tbm poderia fazer uma gambi, colocando outro objeto só para receber o o polígono e forçando o nome de suas entidades internas de pontos… mas não seria uma coisa bonita, entende? Quero aprender a fazer um serviço bonito com o JAXB…

Vlws!

Vmaia

Qual o resultado esperado que você deseja ?

luizalbsilva
<?xml version="1.0" encoding="UTF-8"?>
<shape>
    <polygon>
        <point>
             <x>0</x>
             <y>0</y>
        </point>
        <point>
             <x>0</x>
             <y>10</y>
        </point>
        <point>
             <x>10</x>
             <y>0</y>
        </point>
    </polygon>
    <color>red</color>
</shape>
Vmaia

Acredito que a melhor maneira de fazer isso seria.....

- Criar uma classe Poligons
@XmlAccessorType(XmlAccessType.FIELD)
public class Poligons {
         private List<Point> polygon;
         .........

}
- Na classe Shape.....
public class Shape {

         private Poligons  polygons;
         .......
}

algo parecido com isso..... acredito não deixa de ser uma forma "elegante". MAs eu tbm não encontrei nada que o jaxb possa fazer relativo a isso, ainda.

luizalbsilva

Então, era isso que disse que queria evitar… pq na verdade estaria colocando uma classe apenas para fazer o mapeamento… uma solução não muito bonita, entende? Entre forçar a barra e mudar a tecnologia, pode ter certeza que mudarei a tecnologia, isto é, passarei a usar JABX somente para coisas bem simples mesmo… afinal, esse tipo de notação é corriqueira, e deveria ter uma maneira de fazer isso de forma mais elegante.

Vmaia

Compreendi a tua questão, mas não vejo isso como algo deselegante. Tem algo interessante que você pode testar… claro se tiver o .xsd… o seguinte comando gera automaticamente para você as classe atraves de um arquivo.XSD.

xjc arquivo.xsd -d . -p br.com.pacote

Não lembro agora de cabeça para que serve cada parâmetro, mas se você der uma “gujeada” ou “googleada” que com certeza terá mais informações.

=D

luizalbsilva

Eu chamo de deselegante porque, ao meu ver, cada classe deve ter sua função bem definida. Criar uma classe somente para adequar a leitura ou criação de um XML é muito feio, do meu ponto de vista, pois sua razão de exisitir é tão fraca que uma mudança de framework jah acabaria com a questão. Vou continuar a pesquisar, só para conhecer as potencialidades do JAXB, mesmo pq meu propósito é conhecê-lo… se não fizer, tudo bem, vou “anotar no meu caderninho” :slight_smile: Depois vai ser a vez de avaliar o XStream, tenho boas referências desse outro… se for realmente o caso, uso o segundo, ou mesmo DOM.

Agradecido pela força

Criado 6 de junho de 2010
Ultima resposta 7 de jun. de 2010
Respostas 10
Participantes 2