3
respostas

Calendar Converter

Boa tarde, estou com duvida na parte do Comparable, no caso eu tenho a seguinte XML:


<NavioBTP>
  <Id>1908</Id>
  <Rap>01831  2017</Rap>
  <Navio>SAN ALVARO</Navio>
  <Viagem>718W</Viagem>
  <Agencia>ALI</Agencia>
  <PrevisaoChegada>01/06/2017 180000</PrevisaoChegada>
  <Chegada>\/Date(1496336400000)\/</Chegada>
  <PrevisaoAtracacao>\/Date(1496383200000)\/</PrevisaoAtracacao>
  <Atracacao>\/Date(1496383200000)\/</Atracacao>
  <PrevisaoSaida>02/06/2017 140000</PrevisaoSaida>
  <Saida>\/Date(1496423700000)\/</Saida>
  <AberturaGateDry></AberturaGateDry>
  <AberturaGateRefeer></AberturaGateRefeer>
  <DeadlineCarga></DeadlineCarga>
  <Servico>SAE</Servico>
  <Berco>BTP 3</Berco>
  <Qtd>1</Qtd>
  <PrevDescarga>49</PrevDescarga>
  <PrevEmbarque>0</PrevEmbarque>
  <PrevRemocao>0</PrevRemocao>
  <DirecaoViagem></DirecaoViagem>
  <Ordenador>2459</Ordenador>
</NavioBTP>

que é recebida de um website fora do meu sistema, e preciso passar para uma classe NavioBTP, que tem TODOS os atributos de data como Calendar, mas estou com problema na conversão pois, como podem ver alguns dos campos ali vem como \/Date(long)\/ e alguns como um texto formatado que conseguiria transformar utilizando o SimpleDateFormat,

ficou assim o Converter:

public class DataConverter implements Converter{

    @Override
    public boolean canConvert(Class type) {
        return type.isAssignableFrom(Calendar.class);
    }

    @Override
    public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {
        String data = (String) source;
        Calendar calendar = Calendar.getInstance();
        if(data.startsWith("\\/")){
            calendar.setTimeInMillis(Long.valueOf(data.substring(data.indexOf("(")+1,(data.indexOf(")")))));
        }else{
            SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy HHmmss");
            try {
                calendar.setTimeInMillis(formatter.parse(data).getTime());
            } catch (ParseException e) {
                e.printStackTrace();
            }
        }
        writer.setValue(calendar.toString());
    }

    @Override
    public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
        return null;
    }

espero que possam me dar uma luz, porque ficou bem confuso está parte pra mim!

3 respostas

Oi Lucas,

me dá uma ajudinha, qual é sua duvida concreta ou problema? o converter funciona ou não funciona? Dá alguma exceção?

abs

eu pedi para imprimir o XML para que você possa ver como está formatado, assim o problema fica mais claro, e logo abaixo esta o stacktrace

<NavioBTP>
  <Id>1908</Id>
  <Rap>01831  2017</Rap>
  <Navio>SAN ALVARO</Navio>
  <Viagem>718W</Viagem>
  <Agencia>ALI</Agencia>
  <PrevisaoChegada>01/06/2017 180000</PrevisaoChegada>
  <Chegada>\/Date(1496336400000)\/</Chegada>
  <PrevisaoAtracacao>\/Date(1496383200000)\/</PrevisaoAtracacao>
  <Atracacao>\/Date(1496383200000)\/</Atracacao>
  <PrevisaoSaida>02/06/2017 140000</PrevisaoSaida>
  <Saida>\/Date(1496423700000)\/</Saida>
  <AberturaGateDry></AberturaGateDry>
  <AberturaGateRefeer></AberturaGateRefeer>
  <DeadlineCarga></DeadlineCarga>
  <Servico>SAE</Servico>
  <Berco>BTP 3</Berco>
  <Qtd>1</Qtd>
  <PrevDescarga>49</PrevDescarga>
  <PrevEmbarque>0</PrevEmbarque>
  <PrevRemocao>0</PrevRemocao>
  <DirecaoViagem></DirecaoViagem>
  <Ordenador>2459</Ordenador>
</NavioBTP>
Exception in thread "main" com.thoughtworks.xstream.converters.ConversionException: null
---- Debugging information ----
cause-exception     : java.lang.RuntimeException
cause-message       : null
class               : org.automatizador.walog.models.NavioBTP
required-type       : java.util.GregorianCalendar
path                : /NavioBTP/PrevisaoChegada
line number         : 7
-------------------------------
    at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:63)
    at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:45)
    at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:46)
    at com.thoughtworks.xstream.annotations.AnnotationReflectionConverter.unmarshallField(AnnotationReflectionConverter.java:66)
    at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doUnmarshal(AbstractReflectionConverter.java:188)
    at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshal(AbstractReflectionConverter.java:125)
    at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:56)
    at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:45)
    at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:46)
    at com.thoughtworks.xstream.core.TreeUnmarshaller.start(TreeUnmarshaller.java:117)
    at com.thoughtworks.xstream.core.ReferenceByXPathMarshallingStrategy.unmarshal(ReferenceByXPathMarshallingStrategy.java:29)
    at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:846)
    at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:833)
    at com.thoughtworks.xstream.XStream.fromXML(XStream.java:781)
    at com.thoughtworks.xstream.XStream.fromXML(XStream.java:773)
    at automatizador.BTPScrapperTeste.main(BTPScrapperTeste.java:87)
Caused by: java.lang.RuntimeException
    at com.thoughtworks.xstream.io.xml.AbstractPullReader.moveDown(AbstractPullReader.java:85)
    at com.thoughtworks.xstream.io.ReaderWrapper.moveDown(ReaderWrapper.java:25)
    at com.thoughtworks.xstream.io.path.PathTrackingReader.moveDown(PathTrackingReader.java:26)
    at com.thoughtworks.xstream.converters.extended.GregorianCalendarConverter.unmarshal(GregorianCalendarConverter.java:38)
    at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:56)
    ... 15 more

aqui ele diz ser null a causa da mensagem, mas como pode ver na linha 7 tem informação

Oi Lucas, me manda a exceção completa (tudo que faz parte do stack trace)

abs

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software