2012-05-04 124 views
2

我正在使用抽象類將我的模型本地化爲不同的語言。這是我已經設置了繼承鏈:強制JSON JAXB忽略與澤西島的多態類型的「類型」屬性

//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; 
    ... 
} 

這一切工作在我的球衣JSON的Web服務很好,除了一兩件事:本地化的屬性的所有實例en包含一個額外的字段type

Restaurant JSON:

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

type字段是不希望的和不希望特別是因爲它似乎也需要由傑克遜解析對象時。我在代碼中添加了@JsonIgnoreProperties({"type"}),但沒有成功。

回答

1

多次嘗試並徵求幫助雙方的傑克遜和澤西島的郵件列表後,我找到了解決辦法是:

我的球衣背景下實施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; 
    }