Jersey使用空值渲染JAXB对象(来自web服务),

时间:2014-10-31 16:18:02

标签: json rest jaxb jersey

使用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生成的类但我不想(如果我需要重新生成类)..

我的另一种方法是为数据传输创建一个自定义的类集合,但我认为这种方法可以节省我的时间+代码..

有什么想法吗?

提前感谢所有人。

1 个答案:

答案 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
        }
    }
]
}