Serialize Date dans un service JSON REST web en tant que chaîne ISO-8601
j'ai une application JAX-RS utilisant JBoss comme 7.1, et je poste/obtiens des objets JSON et XML qui incluent des Dates (java.util.Date):
@XmlRootElement
@XmlAccessorType(XmlAccessField.FIELD)
public class MyObject implements Serializable
{
    @XmlSchemaType(name = "dateTime")
    private Date date;
    ...
}
quand j'utilise @Produce ("application/xml") sur la méthode get, les objets sont sérialisés en XML et les dates sont converties en chaînes ISO-8601 (par exemple "2012-12-10T14:50:12.123+02:00").
cependant, si j'utilise @Produce ("application/json") sur la méthode get, les dates dans les objets JSON sont timestamps (par exemple" 1355147452530") à la place de cordes ISO-8601.
Comment puis-je configurer L'implémentation JAX-RS (RESTEasy) pour sérialiser les dates au format JSON comme des chaînes ISO-8601 au lieu de timestamps ?
Merci pour vos réponses.
Note: j'ai aussi essayé d'utiliser un fournisseur JAX-RS personnalisé pour faire la sérialisation JSON pour les Dates
@Provider
@Produces(MediaType.APPLICATION_JSON)
public class CustomJsonDateProvider implements MessageBodyWriter<Date>
{
    ...
}
ce fournisseur semble être enregistré par RESTeasy au démarrage 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.
mais il n'est jamais utilisé !
4 réponses
je suppose que votre parser json est Jackson, essayez:
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd,HH:00", timezone="CET")
public Date date;
(depuis Jackson 2.0)
L'analyseur JBoss par défaut est Jettison, mais je n'ai pas pu changer le format de la date. Je suis donc passé à Jackson et j'ai ajouté la classe suivante à mon projet pour le configurer:
@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;
    }
}
Désolé les gens pour crier à haute voix - j'ai trouvé les réponses ici
http://wiki.fasterxml.com/JacksonFAQDateHandling,
ici
http://wiki.fasterxml.com/JacksonFAQ#Serializing_Dates,
ici
http://wiki.fasterxml.com/JacksonHowToCustomSerializers
ici
http://jackson.codehaus.org/1.1.2/javadoc/org/codehaus/jackson/map/util/StdDateFormat.html
en utilisant le @JsonSerialize(à l'aide de= ... ):
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);
  }
}
Déclarer le même Serializer utilisé par Soap / XML:
@XmlElement(name = "prealert_date")
@XmlSchemaType(name = "dateTime")
@JsonSerialize(using = XMLGregorianCalendarSerializer.class)
protected XMLGregorianCalendar prealertDate;