Tengo tal cadena:
{ "debug":"false", "switchTime":"2017-04-12 17:04:42.896026" }Estoy tratando de obtener un objeto en tal enfoque:
new ObjectMapper().readValue(string, MyObject.class);Y clase MiObjeto:
class MyObject { private Boolean debug; private Timestamp switchTime; //...getters, setters, constructors }Tengo tal excepción:
com.fasterxml.jackson.databind.exc.InvalidFormatException: Can not deserialize value of type java.sql.Timestamp from String "2017-04-12 17:04:42.896026": not a valid representation (error: Failed to parse Date value '2017-04-12 17:04:42.896026': Can not parse date "2017-04-12 17:04:42.896026Z": while it seems to fit format 'yyyy-MM-dd'T'HH:mm:ss.SSS'Z'', parsing fails (leniency? null)) at [Source: {"debug":"false", "switchTime":"2017-04-12 17:04:42.896026"};No entiendo por qué... Si uso en modo de depuración Timestamp.valueOf() con "2017-04-12 17:04:42.896026" - tengo éxito
Creo que debe establecer el formato de fecha/hora esperado usando la anotación @JsonFormat como se muestra a continuación.
class MyObject { private Boolean debug; @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss.SSS") private Timestamp switchTime; //...getters, setters, constructors } También puede establecer la zona horaria como @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss.SSS",timezone="PST")
Enfrenté un problema similar cuando estaba usando lombok en la clase POJO que tiene anotaciones @Builder y @Value
También agregué la anotación AllArgsConstructor y luego funciona bien con mi código de deserializador personalizado
El valor que ve en el modo de depuración es la versión "toString()" del valor real de la marca de tiempo, así que no confíe en lo que inspecciona en el modo de depuración. Puede usar la anotación @JsonFormat que lo ayuda a convertir su marca de tiempo con el formato especificado. ¡También debe cuidar las zonas horarias durante la conversión!