4
respostas

Não funcionou o JAXB

Aparentemente a classe esta identica a do professor, mas não gera XML e a leitura do XML retorna tudo null;

package br.com.alura.View;

import java.util.LinkedList;
import java.util.List;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;

import br.com.alura.Model.Produto;


@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Venda {

    private String formaDePagamento;

    @XmlElementWrapper(name="produtos")
    @XmlElement(name="produto")
    private List<Produto> produtos;


    public void setFormaDePagamento(String formaDePagamento) {
        this.formaDePagamento = formaDePagamento;
    }


    public void setProdutos(List<Produto> produtos) {
        this.produtos = produtos;
    }

    public String getFormaDePagamento() {
        return formaDePagamento;
    }

    public List<Produto> getProdutos() {
        return produtos;
    }

    @Override
    public String toString() {

        return "Forma de pagamento: "+ formaDePagamento + "produtos: \n " + produtos;

    }
}
package br.com.alura.View;

import java.io.File;
import java.io.StringWriter;
import java.util.LinkedList;
import java.util.List;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

import br.com.alura.Model.Produto;

public class MapeandoXMLVenda {

    public static void main(String[] args) throws Exception {

        JAXBContext contexto = JAXBContext.newInstance(Venda.class);
        xmlParaObjeto(contexto);
        objetoParaXml(contexto);
    }

    private static void objetoParaXml(JAXBContext contexto) throws Exception {
        Marshaller marshaller = contexto.createMarshaller();

        Venda venda = new Venda();

        List<Produto> produtos = new LinkedList<>();

        venda.setFormaDePagamento("Credito");

        produtos.add(new Produto("livro de JSF", 29.9));
        produtos.add(new Produto("livro de JSF 2.0", 29.9));
        produtos.add(new Produto("livro de Hibernate", 29.9));
        produtos.add(new Produto("livro de XML", 29.9));
        produtos.add(new Produto("livro de Java OO", 29.9));
        produtos.add(new Produto("livro de PHP", 29.9));
        venda.setProdutos(produtos);

        StringWriter writer = new StringWriter();

        marshaller.marshal(marshaller, writer);

        System.out.println(writer);
    }

    private static void xmlParaObjeto(JAXBContext contexto) throws JAXBException {
        Unmarshaller unmarshaller = contexto.createUnmarshaller();
        Venda venda = (Venda) unmarshaller.unmarshal(new File("src/venda.xml"));

        System.out.println(venda);

    }

}

CONSOLE

Forma de pagamento: nullprodutos: 
 [-----------

Nome do produto: null
Preco do produto: 0.0
-----------, -----------

Nome do produto: null
Preco do produto: 0.0
-----------, -----------

Nome do produto: null
Preco do produto: 0.0
-----------]
Exception in thread "main" javax.xml.bind.JAXBException: class com.sun.xml.internal.bind.v2.runtime.MarshallerImpl e nenhuma de sua superclasse é conhecida para este contexto.
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getBeanInfo(Unknown Source)
    at com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAsRoot(Unknown Source)
    at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.write(Unknown Source)
    at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.marshal(Unknown Source)
    at javax.xml.bind.helpers.AbstractMarshallerImpl.marshal(Unknown Source)
    at br.com.alura.View.MapeandoXMLVenda.objetoParaXml(MapeandoXMLVenda.java:43)
    at br.com.alura.View.MapeandoXMLVenda.main(MapeandoXMLVenda.java:21)
4 respostas

Fala aí Alexandre tudo bem?

Como estão os mapeamentos da sua classe produto?

Fala Fernando,

Então, pelo que vi no curso, não era necessario fazer mapeamento na classe produto, só na classe venda...

package br.com.alura.Model;

public class Produto {

    private String nome;
    private double preco;

    public Produto(String nome, double preco) {
        this.nome = nome;
        this.preco = preco;
    }

    public Produto() {
    }

    public String getNome() {
        return nome;
    }

    public double getPreco() {
        return preco;
    }


    @Override
    public String toString() {
        return "-----------\n" +
        "\nNome do produto: "+ this.getNome() +
        "\nPreco do produto: "+ this.getPreco() +
        "\n-----------";

    }
}

Entendi, faz um pouco de tempo que eu não mexo com JAXB diretamente.

Faz um teste por favor, na sua classe produto crie setters para os atributos e crie um outro construtor sem parâmetros.

Veja se funciona.

Eu estava com o mesmo problema, mas acredito que foi porque a minha classe venda estava com atributos com nomes diferentes das tags do xml.

A partir do momento que eu modifiquei os atributos da classe e os getters e setters para ficarem com os mesmo nome da tag, o problema foi resolvido.