Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Não rodou

Tive problemas na execução.

Se eu não usar as anotações @XmlAccessorType(XmlAccessType.FIELD) e @XmlElement(name="produto") o programa roda, mas, traz a lista vazia, como é esperado. Mas, se eu coloco as anotações da a seguinte Exception

Exception in thread "main" com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
A classe tem duas propriedades do mesmo nome "produtos"
    this problem is related to the following location:
        at public java.util.List br.com.elias.models.Venda.getProdutos()
        at br.com.elias.models.Venda
    this problem is related to the following location:
        at java.util.List br.com.elias.models.Venda.produtos
        at br.com.elias.models.Venda

    at com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException$Builder.check(Unknown Source)
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(Unknown Source)
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(Unknown Source)
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(Unknown Source)
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(Unknown Source)
    at com.sun.xml.internal.bind.v2.ContextFactory.createContext(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at javax.xml.bind.ContextFinder.newInstance(Unknown Source)
    at javax.xml.bind.ContextFinder.newInstance(Unknown Source)
    at javax.xml.bind.ContextFinder.find(Unknown Source)
    at javax.xml.bind.JAXBContext.newInstance(Unknown Source)
    at javax.xml.bind.JAXBContext.newInstance(Unknown Source)
    at br.com.elias.teste.MapeaXMLDireto.main(MapeaXMLDireto.java:13)

Minhas classes estão assim:

package br.com.elias.teste;

import java.io.File;

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

import br.com.elias.models.Venda;

public class MapeaXMLDireto {

    public static void main(String[] args) throws Exception {
        JAXBContext jaxbContext = JAXBContext.newInstance(Venda.class);
        Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();

        Venda venda = (Venda) unmarshaller.unmarshal(new File("src/Arquivo.xml"));

        System.out.println(venda);
    }
}
package br.com.elias.models;

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;

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

    String formaDePagamento;
    List<Produto> produtos;
    public String getFormaDePagamento() {
        return formaDePagamento;
    }
    @XmlElementWrapper(name="produtos")
    @XmlElement(name="produto")
    public List<Produto> getProdutos() {
        return produtos;
    }
    public void setFormaDePagamento(String formaDePagamento) {
        this.formaDePagamento = formaDePagamento;
    }
    public void setProdutos(List<Produto> produtos) {
        this.produtos = produtos;
    }
    @Override
    public String toString() {
        return "Venda [formaDePagamento=" + formaDePagamento + ", produtos=" + produtos + "]";
    }    
}

Qual o meu problema?

1 resposta
solução!

Descobri o problema

Pura burrice minha. Eu coloquei as anotações no getter da lista de produtos. Deveriam ter sido colocadas na declaração do atributo.

package br.com.elias.models;

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;

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

    String formaDePagamento;


    @XmlElementWrapper(name="produtos")
    @XmlElement(name="produto")
    List<Produto> produtos;
    public String getFormaDePagamento() {
        return formaDePagamento;
    }
    public List<Produto> getProdutos() {
        return produtos;
    }
    public void setFormaDePagamento(String formaDePagamento) {
        this.formaDePagamento = formaDePagamento;
    }
    public void setProdutos(List<Produto> produtos) {
        this.produtos = produtos;
    }
    @Override
    public String toString() {
        return "Venda [formaDePagamento=" + formaDePagamento + ", produtos=" + produtos + "]";
    }    
}

De todo modo obrigado