2012-05-04 7 views
2

抽象クラスを使用してモデルをさまざまな言語にローカライズしています。JSON JAXBがJerseyを使用して多態型の型プロパティを無視するようにします

//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サービスで正常に動作します:これは私が設定した継承チェーンでローカライズされたプロパティのすべてのインスタンスentypeを追加フィールドが含まれています。

Restaurant JSON:

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

このtypeフィールドがオブジェクトを解析するとき、また、ジャクソンによって必要とされているようだ、特に以来望ましくないと望ましくありません。私は@JsonIgnoreProperties({"type"})を自分のコードに追加しました。

答えて

1

複数の試みとジャクソンとジャージーメーリングリストの両方に助けを勧誘した後、私が見つけた解決策は以下のとおりです。

マイJERSEYコンテキストがContextResolver<JSONJAXBContext>を実施しました。純粋なJSONパーサーを使用するには、ContextResolver<JacksonJsonProvider>に変更する必要があります。

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

を、コンテキストとして使用:

は第二に、JacksonJsonProviderは、次のように構成されている必要があります。

最後に、次のような方法は、以下のように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; 
    } 
関連する問題