[RESOLVIDO]Problemas com unmarshal JAX-B

2 respostas
V

Galera ao tentar desserializar minha classe utilizando JAX-B me deparo com esta exception:

java.lang.NoSuchMethodException: java.time.LocalDate.<init>()
	at java.lang.Class.getConstructor0(Unknown Source)
	at java.lang.Class.getDeclaredConstructor(Unknown Source)
	at com.sun.xml.internal.bind.v2.ClassFactory.create0(Unknown Source)
	at com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.createInstance(Unknown Source)
	at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.createInstance(Unknown Source)
	at com.sun.xml.internal.bind.v2.runtime.unmarshaller.StructureLoader.startElement(Unknown Source)
	at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(Unknown Source)
	at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement(Unknown Source)
	at com.sun.xml.internal.bind.v2.runtime.unmarshaller.SAXConnector.startElement(Unknown Source)
	at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
	at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
	at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
	at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
	at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(Unknown Source)
	at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(Unknown Source)
	at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(Unknown Source)
	at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(Unknown Source)
	at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(Unknown Source)
	at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(Unknown Source)
	at br.com.agendasolution.agendaonline.resource.testemarshal.main(testemarshal.java:21)

Exception in thread "main" java.lang.NoSuchMethodError: java.time.LocalDate.<init>()
	at com.sun.xml.internal.bind.v2.ClassFactory.create0(Unknown Source)
	at com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.createInstance(Unknown Source)
	at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.createInstance(Unknown Source)
	at com.sun.xml.internal.bind.v2.runtime.unmarshaller.StructureLoader.startElement(Unknown Source)
	at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(Unknown Source)
	at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement(Unknown Source)
	at com.sun.xml.internal.bind.v2.runtime.unmarshaller.SAXConnector.startElement(Unknown Source)
	at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
	at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
	at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
	at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
	at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(Unknown Source)
	at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(Unknown Source)
	at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(Unknown Source)
	at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(Unknown Source)
	at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(Unknown Source)
	at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(Unknown Source)
	at br.com.agendasolution.agendaonline.resource.testemarshal.main(testemarshal.java:21)
Caused by: java.lang.NoSuchMethodException: java.time.LocalDate.<init>()
	at java.lang.Class.getConstructor0(Unknown Source)
	at java.lang.Class.getDeclaredConstructor(Unknown Source)
	... 25 more

meu XML

<evento>
   <id>0</id>
   <titulo>titulo</titulo>
   <descricao>descricao</descricao>
   <diaInteiro>true</diaInteiro>
   <dataHoraInicio>2011-09-01T00:00:00-03:00</dataHoraInicio>
   <dataHoraFim>2011-09-01T00:00:00-03:00</dataHoraFim>
</evento>

minha classe a ser desserializada

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Evento {
	private int id;
	private String titulo;
	private String descricao;
	private boolean diaInteiro;
	private LocalDate dataHoraInicio;
	private LocalDate dataHoraFim;
	
	public Evento(String titulo, String descricao, boolean diaInteiro, LocalDate dataHoraInicio,LocalDate dataHoraFim) {
		super();
		this.titulo = titulo;
		this.descricao = descricao;
		this.diaInteiro = diaInteiro;
		this.dataHoraInicio = dataHoraInicio;
		this.dataHoraFim = dataHoraFim;
	}
	
	public Evento(){
		
	}

	public void setId(int id) {
		this.id = id;
	}
	
	public int getId() {
		return id;
	}
	
	public String getTitulo() {
		return titulo;
	}

	public String getDescricao() {
		return descricao;
	}

	public boolean isDiaInteiro() {
		return diaInteiro;
	}

	public LocalDate getDataHoraInicio() {
		return dataHoraInicio;
	}

	public LocalDate getDataHoraFim() {
		return dataHoraFim;
	}

		
}

e meu codigo JAXB

public static void main(String[] args) throws JAXBException {
		JAXBContext context = JAXBContext.newInstance(Evento.class);

		Unmarshaller unmarshaller = context.createUnmarshaller();

		Evento result = (Evento) unmarshaller.unmarshal(new File("teste.xml"));

	}

Alguem poderia me auxiliar? sei que o JAX-b precisa de um construtor vazio para conseguir efetuar seus processos de marshal e unmarshal, sera que existe a possibilidade dele não conseguir serializar o LocalDate por ser uma classe wrapper de Date e efetuar um processo de factory para criar a data?

2 Respostas

A

Utilize um adapter do JAXB, ex:

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Evento {
private int id;
        
@XmlJavaTypeAdapter(LocalDateAdapter.class)
private LocalDate dataHoraInicio;

Adapter:

import javax.xml.bind.annotation.adapters.XmlAdapter;
import org.joda.time.LocalDate; 

public class LocalDateAdapter extends XmlAdapter<String, LocalDate>{     

    public LocalDate unmarshal(String v) throws Exception {        
        return new LocalDate(v);    
    }     
    
    public String marshal(LocalDate v) throws Exception {        
        return v.toString();    
    }
}
  • dentro do adapter pode fazer o trabalho sujo da conversão, abraços.
V

Perfeito funcionou, muito obrigado !!

Criado 28 de março de 2016
Ultima resposta 29 de mar. de 2016
Respostas 2
Participantes 2