J'utilise Jersey + Jackson pour fournir une couche de services REST JSON à mon application. Le problème que j'ai est que le format de sérialisation par défaut de la date ressemble à cela :
"CreationDate":1292236718456
J'ai d'abord pensé qu'il s'agissait d'un timestamp UNIX... mais il est trop long pour cela. Ma bibliothèque JS côté client a des problèmes pour désérialiser ce format (elle supporte un tas de formats de date différents mais pas celui-ci, je suppose). Je veux changer le format pour qu'il puisse être consommable par ma bibliothèque (en ISO par exemple). Comment puis-je faire cela ? J'ai trouvé un bout de code qui pourrait m'aider mais... où dois-je le mettre puisque je ne contrôle pas l'instanciation du sérialiseur Jackson (Jersey le fait) ?
objectMapper.configure(
SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS, false);
J'ai également trouvé ce code pour la personnalisation JacksonJsonProvider
- La question est comment faire pour que toutes mes classes POJO l'utilisent ?
@Provider
public class MessageBodyWriterJSON extends JacksonJsonProvider {
private static final String DF = "yyyy-MM-dd’T'HH:mm:ss.SSSZ";
@Override
public boolean isWriteable(Class arg0, Type arg1, Annotation[] arg2,
MediaType arg3) {
return super.isWriteable(arg0, arg1, arg2,
arg3);
}
@Override
public void writeTo(Object target, Class arg1, Type arg2, Annotation[] arg3,
MediaType arg4, MultivaluedMap arg5, OutputStream outputStream)
throws IOException, WebApplicationException {
SimpleDateFormat sdf=new SimpleDateFormat(DF);
ObjectMapper om = new ObjectMapper();
om.getDeserializationConfig().setDateFormat(sdf);
om.getSerializationConfig().setDateFormat(sdf);
try {
om.writeValue(outputStream, target);
} catch (JsonGenerationException e) {
throw e;
} catch (JsonMappingException e) {
throw e;
} catch (IOException e) {
throw e;
}
}
}
0 votes
J'ai trouvé que c'était un changement entre Jersey 1.1.5 et Jersey 1.6 - avec Jersey 1.1.5, la sérialisation JSON ressemble à ceci : {"date":"2011-04-01T16:41:18.707+00:00"} - il y a peut-être un article de l'Issue Tracker qui donne des informations de base.
0 votes
Oui, c'est la plomberie et l'installation qui prennent le plus de temps. Je n'ai toujours pas trouvé la solution. Je suggère de sortir les dates sous forme de chaîne et de laisser votre client se charger de convertir les chaînes en dates. Il s'agit de substituer le code à la configuration. Je préfère écrire du code qui est "sous mon contrôle" plutôt que des mystères de configuration que je sais pouvoir contrôler mais qui semblent pour l'instant hors de mon contrôle. Les configurations sont délicates sans exemples explicites qui se trouvent utiliser les mêmes éléments de la boîte à outils Java que vous utilisez. La portabilité est un objectif louable mais vraiment difficile.