Pregunta

Estoy tratando de datos Resolver referencia de un objeto XML en Java usando SimpleXML. El punto de todo esto era convertir una API de JAXB a SimpleXML. Por lo tanto, he utilizado la forma de anotación de analizar el documento. Aquí hay un código:

En la clase de usuario:

@Element(name="created", required=false)
private Date created;

El programador que escribió la API utiliza un DateAdapter convertir la cadena tiró desde el XML directamente en una fecha. Me trató de convertirlo en SimpleXML. Mi hipótesis es que un transformador utiliza el mismo enfoque. Aquí es que el código antes y después ...

Antes:

public class DateAdapter extends XmlAdapter<String, Date> {

  DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

  public Date unmarshal(String date) throws Exception {
    return df.parse(date);
  }

  public String marshal(Date date) throws Exception {
    return df.format(date);
  }
}

Después de:

public class DateAdapter implements Transform<Date> {
  SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

  @Override
  public Date read(String date) throws Exception {
    return df.parse(date);
  }

  @Override
  public String write(Date date) throws Exception {
    return df.format(date);
  }
}

supongo que hice mal la conversión porque ahora estoy recibiendo errores fecha no se puede analizar. Lo extraño es que, incluso si pongo if-else o try-catch bloques dentro de los métodos de lectura y escritura todavía consigo el error.

Así que creo que la pregunta principal es, ¿cómo escribir correctamente un adaptador como el que JAXB a Marshall / Resolver referencia entre la cadena desde el XML y un objeto Date.

¿Fue útil?

Solución

Me solucionó el problema. No tenía nada que ver con la API que estaba trabajando sobre sí mismo, sino más bien la conversión de un doble con una fecha en unmarshalled por el marco XML realidad. La doble almacenada en el XML era en el tiempo Epoch en segundo, con decimales para milisegundos. SimpleXML no era capaz de manejar los decimales correctamente. Mi solución fue pedir sólo por un doble en vez de tener los datos sean unmarshalled en una fecha. Así que me deshice de todo el adaptador y acaba de cambiar

@Element(name="created", required=false)
private Date created;

a

@Element(name="created", required=false)
private double created;

Estoy seguro de que hay una manera simple con convertir esto en una fecha después del hecho, pero me imagino que es mejor simplemente dejarlo como está.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top