2016-11-30 10 views
0

アノテーションを使用して特定のクラスのObjectMapperを追加できる方法はありますか?httpコール中の特定のクラスのオブジェクトマッパーマッピング

@ResponseBody 
public Sample (@RequestBody Sample sample){ 
//some logic 
return sample; 
} 

これマイ入力ペイロードマイ所望の出力が

{ 
    "name":"abcd", 
    "id":"1234" 
} 
あろう

{ 
     "employee":{ 
      "name":"abcd", 
      "id":"1234" 
     } 
    } 

ようになる: - iはRequestMapping等の方法を有するRestControllerで

@JsonRootName("employee") 
public class Sample implements Serializable{ 
    private String name; 
    private String id; 
    // Getters and setters 
} 

1)方法はありますか?同じクラスを使用して入力と出力を実行できます。

2)私のようなWRAP_ROOT_VALUEする可能ObjectMapperのシリアル化機能を必要とするクラスの先頭に@JsonRootNameを追加しました: - これが唯一のこのクラスに反映させるために追加することができます

ObjectMapper mapper = new ObjectMapper(); 
mapper.enable(SerializationFeature.WRAP_ROOT_VALUE); 
mapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE); 

答えて

2

デフォルトのシリアライゼーション動作をそのまま残しておきますか?次に、デシリアライズ時には "従業員"ラッパーを引き出しますが、シリアライズ時にはラッパーなしで記述します。あなたの入力して

ObjectMapper mapper = new ObjectMapper(); 
//mapper.enable(SerializationFeature.WRAP_ROOT_VALUE); 
mapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE); 

、私は希望のシリアル出力ました:このコードを配置する場所については

{"name":"abcd","id":"1234"} 

EDIT

を、私は静的でシングルトンやクラスをお勧めしますあなたの(de)シリアライゼーションを処理するメソッド。 「通常の」または「ラップされた」動作を実行するよりも、2つの異なるマッパーを持つことができます。静的メソッドのアプローチの概要を次に示します。

このメソッドの利点は、呼び出し元がシリアル化の動作を決定できることです。したがって、コードの部分が異なる場合は、別の方法を呼び出すことができます。ラッピング/アンラッピングは両方とも有効であることに注意してください。だからあなたの希望の動作を得るために、あなたはそうのようなこれらのメソッドを呼び出します。

public static void main(String[] args) { 
    Bean bean = SerializationUtil.deserializeWrappedObject(jsonInput, Bean.class); 
    String jsonOutput = SerializationUtil.normalSerialize(bean); 
} 

これがあなたにアピールしない場合は、代わりに特殊なケースを検出し、同じメソッド呼び出しでそれを扱うことができる:

public static <T> T deserialize(String json, Class<T> clazz) throws Exception { 
    if (clazz instanceof Bean) { 
     return wrappedObjectMapper.readValue(json, clazz); 
    } else { 
     return normalObjectMapper.readValue(json, clazz); 
    } 
} 
+0

私の質問は、このオブジェクトマッパーコードをどこに置くかも尋ねます。なぜなら私がBeanを作成すると、プロジェクト全体に適用されるからです。しかし、私は、このサンプルクラスでのみ抹消解除を行い、他のクラスでは抹消しません。 – sunder

+0

@sunder私は自分の答えを更新しました。それはあなたが探しているものですか? – gregbert

関連する問題