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