3

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

}

我确信扩展的 MyApplication 类是通过 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>

理想情况下,我想要一个中心位置来保留 JSON 的任何格式(这与有 @JsonInclude(Include.NON_NULL) 之类的注释相反)。我读过这里,并通过其他 SO 问题扩展 javax.ws.rs.core.Application 是这样做的方法。

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

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

这个设置有什么问题?似乎它应该工作。

4

1 回答 1

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

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

于 2015-04-28T23:10:43.203 回答