强制JSON JAXB忽略带有Jersey的多态类型的'type'属性

时间:2012-05-04 19:33:31

标签: json jaxb jersey jax-rs jackson

我使用抽象类将我的模型本地化为不同的语言。这是我设置的继承链:

//Base model, contains localized fields
public class Restaurant extends LocalizedModel<LocalizedRestaurantData>{

...

}

//Abstract class to support localized fields for all my models
@XmlRootElement
public abstract class LocalizedModel<T extends LocalizedData> {

    private T en;

    public T getEn() {
        return en;
    }
    public void setEn(T en) {
        this.en = en;
    }
    ...
}

//Implementation of the localized fields for the restaurant class.
@XmlRootElement
public class LocalizedRestaurantData extends LocalizedData{

    protected String name;
    protected String address;
    ...
}

这一切在我的Jersey JSON Web服务中都可以正常工作,除了一件事:本地化属性en的所有实例都包含一个额外的字段type

Restaurant JSON:

{
"en": {
        "type": "localizedRestaurantData",
        "address": "1234 Main St.",
        "name": "Tacos Folie"
    },
 ...
}

这个type字段是不受欢迎的并且是不合需要的,特别是因为在解析对象时Jackson似乎也需要它。我在代码中添加了@JsonIgnoreProperties({"type"})但没有成功。

1 个答案:

答案 0 :(得分:1)

经过多次尝试并在杰克逊和泽西岛邮件列表上寻求帮助后,我找到的解决方案是:

我的JERSEY上下文正在实施ContextResolver<JSONJAXBContext>。需要将其更改为ContextResolver<JacksonJsonProvider>才能使用纯JSON解析器。

其次,JacksonJsonProvider需要配置如下:

JacksonJsonProvider jjp = new JacksonJsonProvider();
jjp.configure(Feature.WRITE_NULL_MAP_VALUES, false);
jjp.configure(Feature.WRITE_NULL_PROPERTIES, false);

并用作上下文。

最后,需要在ContextResolver中重写以下方法:

@Override
    public Set<Object> getSingletons() {
      Set<Object> s = new HashSet<Object>();
      JacksonJsonProvider jjp = new JacksonJsonProvider();
      jjp.configure(Feature.WRITE_NULL_MAP_VALUES, false);
      jjp.configure(Feature.WRITE_NULL_PROPERTIES, false);
      s.add(jjp);
      return s;
    }