XML com Date utilizando JAXB

Bom dia pessoal!!

Estou gerando um XML de um objeto utilizando JAXB, e um dos atributos é dtVencimento do tipo Date.
Mas o xml está sendo criado com a tag do dtVencimento errada, está assim:

<DadosChave>
<idChaveAcesso>12</idChaveAcesso>
<idCliente>11</idCliente>
<cnpj>11111111111111</cnpj>
<codEstado>42</codEstado>
<qtdUsuario>1</qtdUsuario>
<numSerieHD>00000000</numSerieHD>
<paf>true</paf>
<dtVencimento/>
</DadosChave>

Classe usada para criação do xml:

public static String toXML(Object obj) throws IOException {

	try {
		
		StringWriter writer = new StringWriter();
		Marshaller m = context.createMarshaller();
		m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
		m.marshal(obj, writer);
		
		String xml = writer.toString();
		return xml;
		
	} catch (JAXBException e) {
		
		e.printStackTrace();
		return null;
		
	}
	
}

O conteúdo do dtVencimento que está chegando é um Date “2017-12-31”.
Alguma dica do motivo que a tag está sendo criada dessa maneira?

Obs: é meu primeiro post e acabei não encontrando a opção de incluir o código, então peço desculpas pelo jeito que postei a classe no meio do texto.

Boa tarde Cristine_Dimon_Maxim,

Fiz um exemplo local aqui baseado em seu XML e não vi nada de errado na operação de parse do marshall ou unmarshall dele.

Talvez vc esteja esquecendo de passar algum parametro para o seu objeto/xml. Utilize se achar conveniente:

-XMLWrapper

import java.io.File;
import java.text.ParseException;
import java.util.Date;

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

import br.com.esocial.business.DadosChave;

public class XMLWrapper {
	
	private static final String FILE_PATH = "C:/Tools/workspace/AssinaturaDigitaleSocial/data/";

	public static void marshall() throws ParseException {

		DadosChave dc = new DadosChave();
		dc.setCnpj(1324567890);
		dc.setCodEstado(444);
		dc.setDtVencimento(new Date());
		dc.setIdChaveAcesso(999);
		dc.setIdCliente(51);
		dc.setNumSerieHD(357159);;
		dc.setPaf(true);
		dc.setQtdUsuario(10);

		try {

			File file = new File(FILE_PATH + "/file.xml");
			JAXBContext jaxbContext = JAXBContext.newInstance(DadosChave.class);
			Marshaller jaxbMarshaller = jaxbContext.createMarshaller();

			// output pretty printed
			jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
			jaxbMarshaller.marshal(dc, file);
			jaxbMarshaller.marshal(dc, System.out);

		} catch (JAXBException e) {
			e.printStackTrace();
		}
	}

	public static void unmarshall() {

		try {

			File file = new File(FILE_PATH + "/file.xml");
			JAXBContext jaxbContext = JAXBContext.newInstance(DadosChave.class);

			Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
			DadosChave customer = (DadosChave) jaxbUnmarshaller.unmarshal(file);
			System.out.println(customer);
		} catch (JAXBException e) {
			e.printStackTrace();
		}
	}
}

-DadosChave:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.xml.bind.annotation.XmlRootElement;

/**
 * 
 * @author Emerzoom
 * 
 *     <DadosChave> 
 *         <idChaveAcesso>12</idChaveAcesso>
 *         <idCliente>11</idCliente> 
 *         <cnpj>11111111111111</cnpj>
 *         <codEstado>42</codEstado> 
 *         <qtdUsuario>1</qtdUsuario>
 *         <numSerieHD>00000000</numSerieHD> 
 *         <paf>true</paf> 
 *         <dtVencimento/>
 *     </DadosChave>
 *
 */
@XmlRootElement
public class DadosChave {

	private Integer idChaveAcesso;
	private Integer idCliente;
	private Integer cnpj;
	private Integer codEstado;
	private Integer qtdUsuario;
	private Integer numSerieHD;
	private boolean paf;
	private Date dtVencimento;
	private SimpleDateFormat sdf = null;
	
	public DadosChave() {
		// TODO Auto-generated constructor stub
		sdf = new SimpleDateFormat("YYYY-MM-DD");
	}

	public Integer getIdChaveAcesso() {
		return idChaveAcesso;
	}

	public void setIdChaveAcesso(Integer idChaveAcesso) {
		this.idChaveAcesso = idChaveAcesso;
	}

	public Integer getIdCliente() {
		return idCliente;
	}

	public void setIdCliente(Integer idCliente) {
		this.idCliente = idCliente;
	}

	public Integer getCnpj() {
		return cnpj;
	}

	public void setCnpj(Integer cnpj) {
		this.cnpj = cnpj;
	}

	public Integer getCodEstado() {
		return codEstado;
	}

	public void setCodEstado(Integer codEstado) {
		this.codEstado = codEstado;
	}

	public Integer getQtdUsuario() {
		return qtdUsuario;
	}

	public void setQtdUsuario(Integer qtdUsuario) {
		this.qtdUsuario = qtdUsuario;
	}

	public Integer getNumSerieHD() {
		return numSerieHD;
	}

	public void setNumSerieHD(Integer numSerieHD) {
		this.numSerieHD = numSerieHD;
	}

	public boolean isPaf() {
		return paf;
	}

	public void setPaf(boolean paf) {
		this.paf = paf;
	}

	public Date getDtVencimento() {
		return dtVencimento;
	}

	public void setDtVencimento(Date dtVencimento) throws ParseException {
		this.dtVencimento = sdf.parse(sdf.format(dtVencimento));
	}

	@Override
	public String toString() {
		return "DadosChave [idChaveAcesso=" + idChaveAcesso + ", idCliente="
				+ idCliente + ", cnpj=" + cnpj + ", codEstado=" + codEstado
				+ ", qtdUsuario=" + qtdUsuario + ", numSerieHD=" + numSerieHD
				+ ", paf=" + paf + ", dtVencimento=" + dtVencimento + "]";
	}
}

-Main:

import java.text.ParseException;

import br.com.esocial.test.XMLWrapper;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		try {
			XMLWrapper.marshall();
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		XMLWrapper.unmarshall();
	}
}

-Resultado no Console:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<dadosChave>
    <cnpj>1324567890</cnpj>
    <codEstado>444</codEstado>
    <dtVencimento>2017-01-01T00:00:00-02:00</dtVencimento>
    <idChaveAcesso>999</idChaveAcesso>
    <idCliente>51</idCliente>
    <numSerieHD>357159</numSerieHD>
    <paf>true</paf>
    <qtdUsuario>10</qtdUsuario>
</dadosChave>
DadosChave [idChaveAcesso=999, idCliente=51, cnpj=1324567890, codEstado=444, qtdUsuario=10, numSerieHD=357159, paf=true, dtVencimento=Sun Jan 01 00:00:00 BRST 2017]
1 curtida

Olá Emerzoom,

Da uma verificada nessa abordagem:

@XmlJavaTypeAdapter(value = DataAdapter.class)
private Date data;

Classe utilizada na anotação:

public class DataAdapter extends XmlAdapter<String, Date> {

	private static final SimpleDateFormat SIMPLE_DATE_FORMAT = new SimpleDateFormat("PADRAO QUE VC DESEJA");
	
	@Override
	public String marshal(Date data) throws Exception {
		return SIMPLE_DATE_FORMAT.format(data);
	}

	@Override
	public Date unmarshal(String stringData) throws Exception {
		return SIMPLE_DATE_FORMAT.parse(stringData);
	}

}
2 curtidas

Boa tarde Weverton_Reis,

É uma ótima opção aplicar Design Patterns, que aqui no caso, é um Adapter.
O bom é que vc pode utilizar esse adapter em qq lugar sem nenhum acoplamento de código e torna a programação mais modal, seguindo os usos de Annotations.
O que vc fez é em suma, muito mais avançado do que eu fiz, pois, fiz imaginando que a Cristine_Dimon_Maxim tivesse um conhecimento limitado sobre o tema. Mas, isso é, sem dúvidas uma ótima forma de implementar, dada a elegância e a limpesa do código-fonte. Se foi vc quem criou, meus parabéns, se não, meus parabéns por vc ter o conhecimento de algo tão avançado.

1 curtida

Funcionou!!

Emerzoom acabei vendo que você estava fazendo a formatação da data, fiz o mesmo aqui e deu super certo!!

E já apliquei logo em seguida a sua lógica Weverton_Reis, muito obrigado!

Valeu pessoal!!

1 curtida

[RESOLVIDO]
Que bom que deu certo! Disponha.

2 curtidas

Show =)