Dúvida em mapeamento do JAXB

10 respostas
LaercioPontin

Bom dia pessoal,
Estou com um problema e não sei como solucionar ou se tem algum modo de ser feito.
Estou realizando a exportação de arquivos em XML utilizando o JAXB, já implemente grande parte da minha aplicação mas estou me debatendo com algumas peculiaridades e elas são as seguinte:

tenho uma classe A, que tem alguns atributos nativo do JAVA (String, Integer, Date) e ainda possui um atributo Classe B.

Classe A
public class A  {
	
	private String funcao;
        private String horaTrabalho;
        private B pessoa;

	@XmlAttribute(name = "funcao")
	public String getFuncao() {
		return funcao;
	}
        @XmlAttribute(name = "horaTrabalho")
	public String getHoraTrabalho() {
		return horaTrabalho;
	}
	public String getPessoa() {
		return pessoa;
	}
	//set's 

}
Classe B
public class B  {
	
	private String nome;
        private Integer idade;
	private String nomeMae;
        private String nomePai;
        
        @XmlAttribute(name = "nome")
	public String getNome() {
		return nome;
	}
        @XmlAttribute(name = "idade")
	public Integer getIdade() {
		return idade;
	}
        @XmlAttribute(name = "nomePai")
	public String getNomePai() {
		return nomePai;
	}
        @XmlAttribute(name = "nomeMae")
	public String getNomeMae() {
		return nomeMae;
	}
	
	//set's 

}

Meu arquivo XML gerado fica do seguinte modo:

...
<a funcao="abc" horaTrablho="12">
    <b nome="abcd" idade="23" nomeMae="mae abcd" nomePai="pai abcd"/>
</a>
...

A Classe B vira um elemento da Classe A.

Gostaria de saber como devo fazer o mapeamento para conseguir que a Classe A absorvesse os dados da Classe B e os tornassem atributos e não elemento. (estender a classe seria uma "gambiarra" mas funcionaria, porem é possível estender apenas 1 classe pai e em alguns casos preciso de 2 ou 3 classe)

Bem o resultado que eu desejo é:
...
<a funcao="abc" horaTrablho="12" nome="abcd" idade="23" nomeMae="mae abcd" nomePai="pai abcd" /a>
...

Espero que consigam entender a minha dúvida e que possam me ajudar.
Grato

10 Respostas

luiz_renato

A única forma que consigo imaginar seria cria métodos acessores get que retornariam os valores do atributo B e anotar esses métodos com @XmlAttribute - creio que nesse caso não seja gambiarra pois B é um atributo de A e esta pode muito bem decidir qual forma retornar os seus atributos.

LaercioPontin

Seria interessante desse modo mesmo, já estava desistindo e prestes a colocar todos os atributos em todas as classes, hehe. Vou criar os métodos get’s. Vlw.

LaercioPontin

Feedback:

A solução acima apresentada pelo colega não solucionou, irei colocar os atributos primitivos que preciso na minha classe enquanto não encontrar uma solução cabível.

felipeguerra

Sinceramente, eu não sei qual é o problema, por exemplo, de se criar uma outra classe que represente o seu modelo (na qual os atributos de A e de B estão no mesmo nível)…

LaercioPontin

Creio que essa seja a função de um objeto, criar uma classe para que outras possam utiliza-las. No meu exemplo foi algo simples, mas a minha necessidade é algo diferente. Tenho a necessidade de utilizar a Classe B em enumeras outras classes, e pretendia deixar meu código seco, mas não vejo uma maneira.

felipeguerra

Confesso que não conheço todo o poder das anotações que o JAXB oferece, então, veja se há algo aqui que te ajude:

http://docs.oracle.com/javase/6/docs/api/javax/xml/bind/annotation/package-summary.html

luiz_renato

Vc quer que fique assim?

<classsA nomePai="Nome pai" nomeMae="Nome mae" nome="Nome 1" idade="10" horaTrabalho="2 horas" funcao="funcao 1"/>

Faz o seguinte: mantem os metodos acessores em A e tira o método getPessoa .

felipeguerra

ou, crie métodos em A que chame atributos de B e anote com XMLAttribute…

LaercioPontin

Vou fazer esses testes aqui e volto para dar um feedback. Grato

LaercioPontin

Feedback:

Nenhuma das alternativas deu certo, então vou ficar com essa coisa feia ai embaixo citada (hehe):

LaercioPontin:
Feedback:

A solução acima apresentada pelo colega não solucionou, irei colocar os atributos primitivos que preciso na minha classe enquanto não encontrar uma solução cabível.

Criado 26 de julho de 2012
Ultima resposta 27 de jul. de 2012
Respostas 10
Participantes 3