3 votes

Le mappeur d'objets Jackson n'utilise pas les fonctions setDateFormat ou setSerializationInclusion du mappeur.

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.

0voto

Enrichman Points 3505

Je ne peux pas tester l'ensemble de votre configuration mais la configuration du mappeur semble fonctionner.

Je l'ai testé comme ça :

ObjectMapper mapper = new ObjectMapper();
mapper.setDateFormat(new SimpleDateFormat("yyyy.MM.dd G 'at' HH:mm:ss z"));
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

et le résultat d'un objet simple (avec un champ nul) est :

{
    date: "2015.04.28 AD at 23:54:37 CEST"
}

donc je dirais que votre fournisseur n'est pas correctement injecté. J'ai fait beaucoup de tests mais je n'ai pas réussi à l'injecter correctement, dans mon cas le getContext(Class<?> arg0) n'a pas été appelé, et donc l'ObjectMapper utilisé n'était pas celui "personnalisé" : / /.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X