2014-01-17 3 views
0

일련의 JSON 문서를 개체 모델로 변환하려는 라이브러리에서 작업하고 있습니다. 모든 객체는 고유 한 식별자로 표시되며 Jackson의 @JsonIdentityInfo 주석을 사용하여 결과 객체가 서로 참조 할 수있게하고 싶습니다. 각 개체의 ID를여러 문서에서 jackson 개체 ID 매핑 사용

@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="_id") 
abstract public class SDBObject extends JSONSerialisable { 
    /** The (mongodb) object identifier */ 
    @JsonProperty("_id") 
    private String id; 
... 
} 

을 가지고 내가 뭘하고 싶은 다음 모든 것을이 하나의 JSON 문서로 가로 질러왔다면이 충분히 쉬울 것이다

public class SDBStream extends SDBObject { 
    /** The owning node */ 
    @JsonIdentityReference(alwaysAsId = true) 
    @JsonProperty("nid") 
    private SDBNode node; 
... 
} 

와 객체를 연결 할 수 있습니다. 그러나 일련의 유형별 문서로 다양한 객체를받습니다.

기존 id 및 객체 사전으로 ID 매핑 시스템을 미리로드하여 ID가 ​​발생하면 이후에 디코딩 된 문서에서 기존 객체를 사용할 수 있도록하고 싶습니다.

어디에서이 정보를 ObjectMapper에 주입해야합니까?

답변

1

가장 쉬운 방법은 findObjectId를 확장하여 알려진 객체를 바인딩하는 DefaultDeserializationContext의 하위 클래스를 제공하는 것입니다. 다음 줄의 어떤 것 :

public class SDBDeserializationContext extends DefaultDeserializationContext { 
    private SDBContext context; 

    public SDBDeserializationContext(DeserializerFactory df, 
     DeserializerCache cache, SDBContext context) { 
    super(df, cache); 
    this.context = context; 
    } 

    public SDBDeserializationContext(SDBDeserializationContext src, 
     DeserializerFactory factory) { 
    super(src, factory); 
    this.context = src.context; 
    } 

    public SDBDeserializationContext(SDBDeserializationContext src, 
     DeserializationConfig config, JsonParser jp, InjectableValues values) { 
    super(src, config, jp, values); 
    this.context = src.context; 
    } 

    @Override 
    public DefaultDeserializationContext with(DeserializerFactory factory) { 
    return new SDBDeserializationContext(this, factory); 
    } 

    @Override 
    public DefaultDeserializationContext createInstance(
     DeserializationConfig config, JsonParser jp, InjectableValues values) { 
    return new SDBDeserializationContext(this, config, jp, values); 
    } 

    @Override 
    public ReadableObjectId findObjectId(Object id, ObjectIdGenerator<?> generator) { 
    ReadableObjectId oid = super.findObjectId(id, generator); 

    if (oid.item == null && this.context != null) { 
     SDBObject object = this.context.findBinding(id); 
     if (object != null) 
     try { 
      oid.bindItem(object); 
     } catch (IOException ex) { 
      throw new IllegalStateException("Unable to bind " + object + " to " + id, ex); 
     } 
    } 
    return oid; 
    } 
}