J'ai écrit une classe qui étend javax.ws.rs.core.Application :
@ApplicationPath(value = "/*")
public class MyApplication extends Application {
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> classes = new HashSet<Class<?>>();
// your classes here
classes.add(ObjectMapperProvider.class);
return classes;
}
}
Le seul but est de remplacer l'ObjectMapperProvider par défaut et d'inclure cette classe dans l'application.
@Provider
@Produces("application/json")
public class ObjectMapperProvider implements ContextResolver<ObjectMapper> {
private ObjectMapper mapper = new ObjectMapper();
public ObjectMapperProvider() {
mapper.setDateFormat(new SimpleDateFormat("yyyy.MM.dd G 'at' HH:mm:ss z"));
mapper.setSerializationInclusion(JsonSerialize.Inclusion.NON_NULL);
}
@Override
public ObjectMapper getContext(Class<?> arg0) {
return mapper;
}
}
Je suis sûr que la classe étendue MyApplication est chargée via le fichier web.xml.
<web-app ...>
<context-param>
<param-name>javax.ws.rs.core.Application</param-name>
<param-value>com.mycomp.somedir.application.MyApplication</param-value>
</context-param>
...
<servlet>
<servlet-name>Resteasy</servlet-name>
<servlet-class>
org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher
</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>com.mycomp.somedir.application.MyApplication</param-value>
</init-param>
</servlet>
...
</web-app>
Idéalement, j'aimerais disposer d'un emplacement central pour conserver tout type de formatage du JSON (par opposition à des annotations comme @JsonInclude(Include.NON_NULL) ). J'ai lu aquí et par d'autres questions du S.O. que l'extension de javax.ws.rs.core.Application est le moyen de le faire.
Malheureusement, le JSON comprend toujours des nuls, ainsi que l'horodatage en ms. Voici un exemple :
{
"result":"success",
"object":{
"objectId":"25",
"userId":"user id 22",
"creationDate":1378843680000,
"lastUpdatedDate":null,
"title":"title 2",
"defaultImg":"http://someurl2",
"size":3,
"lastEditDate":1378843680000
}
Qu'est-ce qui ne va pas dans cette configuration ? Il semble qu'elle devrait fonctionner.