tutorial example easy json jax-rs jboss7.x resteasy

example - Fecha de serialización en un servicio web REST de JSON como una cadena ISO-8601



resteasy maven (4)

Declare el mismo Serializer utilizado por Soap / XML:

@XmlElement(name = "prealert_date") @XmlSchemaType(name = "dateTime") @JsonSerialize(using = XMLGregorianCalendarSerializer.class) protected XMLGregorianCalendar prealertDate;

Tengo una aplicación JAX-RS que usa JBoss AS 7.1 y POST / GET JSON y objetos XML que incluyen fechas (java.util.Date):

@XmlRootElement @XmlAccessorType(XmlAccessField.FIELD) public class MyObject implements Serializable { @XmlSchemaType(name = "dateTime") private Date date; ... }

Cuando uso @Produce ("application / xml") en el método get, los objetos se serializan como XML y las fechas se convierten en cadenas ISO-8601 (por ejemplo, "2012-12-10T14: 50: 12.123 + 02: 00" ).

Sin embargo, si uso @Produce ("application / json") en el método de obtención, las fechas en los objetos JSON son marcas de tiempo (por ejemplo, "1355147452530") en lugar de cadenas ISO-8601.

¿Cómo puedo configurar la implementación JAX-RS (RESTEasy) para serializar fechas en formato JSON como cadenas ISO-8601 en lugar de marcas de tiempo?

Gracias por sus respuestas.

Nota: También intenté usar un proveedor JAX-RS personalizado para realizar la serialización JSON para las fechas

@Provider @Produces(MediaType.APPLICATION_JSON) public class CustomJsonDateProvider implements MessageBodyWriter<Date> { ... }

Este proveedor parece estar registrado por RESTeasy en el inicio de JBoss:

[org.jboss.jaxrs] Adding JAX-RS provider classes: package.CustomJsonDateProvider ... [org.jboss.resteasy.cdi.CdiInjectorFactory] No CDI beans found for class package.CustomJsonDateProvider. Using default ConstructorInjector.

¡Pero nunca se usa!


El analizador de JBoss predeterminado es Jettison, pero no pude cambiar el formato de fecha. Así que me cambié a Jackson y agregué la siguiente clase a mi proyecto para configurarlo:

@Provider @Produces(MediaType.APPLICATION_JSON) public class JacksonConfig implements ContextResolver<ObjectMapper> { private final ObjectMapper objectMapper; public JacksonConfig() { objectMapper = new ObjectMapper(); objectMapper.configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESPAMPS, false); } @Override public ObjectMapper getContext(Class<?> objectType) { return objectMapper; } }


Lo siento gente por gritar en voz alta. Encontré las respuestas aquí.

http://wiki.fasterxml.com/JacksonFAQDateHandling ,

aquí

http://wiki.fasterxml.com/JacksonFAQ#Serializing_Dates ,

aquí

http://wiki.fasterxml.com/JacksonHowToCustomSerializers

aquí

http://jackson.codehaus.org/1.1.2/javadoc/org/codehaus/jackson/map/util/StdDateFormat.html

Usando el modo @JsonSerialize (usando = ...):

public class JsonStdDateSerializer extends JsonSerializer<Date> { private static final DateFormat iso8601Format = StdDateFormat.getBlueprintISO8601Format(); @Override public void serialize( Date date, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException { // clone because DateFormat is not thread-safe DateFormat myformat = (DateFormat) iso8601Format.clone(); String formattedDate = myformat.format(date); jgen.writeString(formattedDate); } }


Supongo que su analizador json es Jackson, intente:

@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd,HH:00", timezone="CET") public Date date;

(Desde Jackson 2.0)