我编写了一个扩展 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
}
这个设置有什么问题?似乎它应该工作。