使用Oracle Rightnow,Jersey 1.18,JAX-WS,JDeveloper 11.1.1.7.1
我为我们的Rightnow实例创建了一个REST接口,我遇到了一个空值问题。
我通过JAX-WS访问RightNow,并使用JAXB Objects生成静态代理。在过去,我已经能够简单地将JAXB对象返回到Jersey并且它变得可爱。但是使用Rightnow我会获得许多额外的(空)字段。在不同的系统(Oracle SalesCloud)上,这些字段不会被渲染默认..
另外值得注意的是我不会返回原始的对象列表(事件就是我的例子),但我使用自己的类包装列表,所以我可以放一个@XmlRootElement注释。
我的包装器看起来像这样
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL) // tried this doesnt work
public class RESTIncidents {
private List<Incident> incidents;
public void setIncidents(List<Incident> incidents) {
this.incidents = incidents;
}
}
我得到的结果是
{
"incidents" : [
{
"Asset" : null, "AssignedTo" : {
"Account" : null, "StaffGroup" : {
"ID" : {
"id" : 100885
},"Name" : "B2CHousewares"
},"ValidNullFields" : null
},"BilledMinutes" : null, "Category" : {
"ID" : {
"id" : 124
},"Parents" : [
{
.....
我查看了使用@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)注释,但这似乎不起作用,我猜它,因为它只影响这个类。我可以将它添加到所有JAXB生成的类但我不想(如果我需要重新生成类)..
我的另一种方法是为数据传输创建一个自定义的类集合,但我认为这种方法可以节省我的时间+代码..
有什么想法吗?
提前感谢所有人。
答案 0 :(得分:0)
我设法把它吓死了..
我需要创建一个自定义的Object Mapper并告诉它不要渲染空值,这适用于为我生成的JAXB对象。
只需创建一个mapper类并确保存在@Provider标记
另请注意,我的代码适用于Jersey 1.x,特别是1.8
打包myPackage;
import javax.ws.rs.ext.ContextResolver;
import javax.ws.rs.ext.Provider;
import org.codehaus.jackson.map.DeserializationConfig;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.SerializationConfig;
import org.codehaus.jackson.map.annotate.JsonSerialize;
@Provider
public class CustomJSONObjectMapper implements ContextResolver<ObjectMapper> {
private ObjectMapper objectMapper;
public CustomJSONObjectMapper() throws Exception {
System.out.println("My object mapper init");
objectMapper= new ObjectMapper();
// Force all conversions to be NON_NULL for JSON
objectMapper.setSerializationInclusion(JsonSerialize.Inclusion.NON_NULL);
}
public ObjectMapper getContext(Class<?> objectType) {
System.out.println("My Object Mapper called");
return objectMapper;
}
}
结果是
{
"organization" : [
{
"id" : {
"id" : 68
},"lookupName" : "AngieSoft", "createdTime" : 1412166303000, "updatedTime" : 1412166303000, "name" : "AngieSoft", "salesSettings" : {
"salesAccount" : {
"id" : {
"id" : 2
}
},"totalRevenue" : {
"currency" : {
"id" : {
"id" : 1
}
}
}
},"source" : {
"id" : {
"id" : 1002
},"parents" : [
{
"id" : {
"id" : 32002
}
}
]
},"crmmodules" : {
"marketing" : true, "sales" : true, "service" : true
}
}
]
}