我编写了一个扩展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
}
此设置有什么问题?好像它应该有效。
答案 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不是“自定义”的。 :/