Jackson Object Mapper未使用Mapper的setDateFormat或setSerializationInclusion

时间:2013-09-16 19:00:16

标签: json spring rest jackson

我编写了一个扩展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;
     }
}

这样做的唯一目的是覆盖默认的ObjectMapperProvider,并在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;
    }

}

我确信通过web.xml文件加载了扩展的MyApplication类。

<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>

理想情况下,我想要一个中心位置来保留JSON的任何格式(这与@JsonInclude(Include.NON_NULL)等注释相反)。我已阅读here,并通过其他S.O.扩展javax.ws.rs.core.Application的问题就是这样做的。

不幸的是,JSON仍然包含空值以及以ms为单位的时间戳。这是一个例子:

{
   "result":"success",
   "object":{
      "objectId":"25",
      "userId":"user id 22",
      "creationDate":1378843680000,
      "lastUpdatedDate":null,
      "title":"title 2",
      "defaultImg":"http://someurl2",
      "size":3,
      "lastEditDate":1378843680000
   }

此设置有什么问题?好像它应该有效。

1 个答案:

答案 0 :(得分:0)

我无法测试您的整个配置,但映射器配置似乎有效。

我已经测试过它了:

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

并且来自简单对象(带有空字段)的结果是:

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

所以我会说你的提供商没有正确注入。 我做了很多测试但是我无法正确地注入它,在我的情况下getContext(Class<?> arg0)没有被调用,因此使用的ObjectMapper不是“自定义”的。 :/