2016-10-14 3 views
3

jacksonを使用して必要なフィールドのみをマッピングするカスタムデシリアライザを作成しました。ここに行く。カスタムデシリアライザクラスにフィールドを渡す

public class GeneralDeserializer extends JsonDeserializer<GeneralDomain> { 

    @Override 
    public GeneralDomain deserialize(JsonParser jp, DeserializationContext ctxt) 
      throws IOException, JsonProcessingException { 

     final JsonNode jsonNode = jp.getCodec().readTree(jp); 
     final Map<String, String> map = new ObjectMapper().convertValue(jsonNode, Map.class); 
     final String event = "Proxy"; 
     return new GeneralDomain(map.get("id"), event, map.get("name"), map.get("lastLogin")); 
    } 

    @Override 
    public Class<GeneralDomain> handledType() { 
     return GeneralDomain.class; 
    } 
} 

私は余分な注釈を追加するためにmixinクラスも持っています。

@JsonDeserialize(using = GeneralDeserializer.class) 
public class GeneralDomainMixIn{} 

私はこれは素晴らしい作品

ObjectMapper mapper = new ObjectMapper(); 
mapper.addMixIn(GeneralDomain.class, SimpleRevealPublicEventMixIn.class); 
String json = "{\"id\": 111, \"name\": David, \"lastLogin\": \"02-10-2016 10:32:00 AM\"}"; 
GeneralDomain readValue = mapper.readValue(json, GeneralDomain.class); 

、この方法でオブジェクトを取得します。しかし、カスタムデシリアライザで見ることができるように、私はイベントフィールド値をハードコーディングしています。これは、メインクラスの他のインスタンス変数によって渡されます。このフィールドをカスタムデシリアライザに渡す必要があります。デシリアライザ内でこの変数にアクセスする方法はありますか?あるいはこれを達成するための他の方法がありますか?私を助けてください。ありがとう。

+1

おそらく既にここに回答している可能性があります。http://stackoverflow.com/questions/2713316 1/how-to-pass-constructors-parameters-with-jacksonを使用します。これは役に立ちますか? –

+0

@DanielScott遅く返事を申し訳ありません。はい、私はあなたが投稿したリンクを通過しました。私の問題は、 '@ deserialize'アノテーションを使用するMixInクラスがあることです。たとえ私が渡す必要のある値を取るコンストラクタを作成したとしても、MixInクラスでどのようにこれを行うのですか?あなたが知っていれば説明していただけますか?ありがとう – 15R6

答えて

2

最後に答えが見つかりました。このlinkのフィリップに感謝します。

私がしなければならなかったのはこれでした。

private InjectableValues newInjectableValues() { 
    return new InjectableValues.Std() 
    .addValue("event", "proxy") 
} 

使用私のデシリアライズの方法ではマッパークラス

GeneralDomain readValue = mapper.setInjectableValues(injectEventType()).readValue(json, GeneralDomain.class); 

でinjectablevalues方法を設定するには、この方法をInjectableValuesのインスタンスを作成します。私はInjectableValuesが提供する値を取得する必要がありました:

String event = String.valueOf(ctxt.findInjectableValue("event", null, null)); 
関連する問題