2

モデルをさまざまな言語にローカライズするために抽象クラスを使用しています。これは私が設定した継承チェーンです:

//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サービスで正常に機能しますが、1つだけ例外があります。ローカライズされたプロパティのすべてのインスタンスにen追加のフィールドが含まれていますtype

RestaurantJSON:

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

このtypeフィールドは、オブジェクトを解析するときにジャクソンによっても必要とされるように思われるため、望ましくなく、望ましくありません。@JsonIgnoreProperties({"type"})コードを追加しましたが、成功しませんでした。

4

1 に答える 1

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;
    }
于 2012-05-14T20:42:27.103 に答える