2016-01-15 3 views
2

Я использую пользовательский TypeID распознаватель для одного из моих классов, до сих пор я, опираясь на поддержку аннотаций:Джексон - Пользовательские TypeId Резольвер

@JsonTypeInfo(
    use = JsonTypeInfo.Id.CUSTOM, 
    include = JsonTypeInfo.As.PROPERTY, 
    property = "@type") 
@JsonTypeIdResolver(ColumnDefinitionTypeResolver.class) 

Но теперь мне нужно настроить создание распознавателя типа, передавая ему некоторые другие зависимости через конструктор или сеттеры, а так как Джексон - это тот, кто его создает, я не могу найти пути вокруг него.

Есть ли способ настроить ObjectMapper для использования TypeIdResolver вместо того, чтобы полагаться на аннотации?

С уважением

ответ

2

Так у вас есть два варианта:

1) Если вы, установленные на использование @JsonTypeIdResolver застряли с использованием static состояния вашего TypeIdResolver. Это, вероятно, не то, что вы хотите.

По умолчанию JacksonAnnotationIntrospector попытается создать экземпляр типа, который вы предоставляете, используя за свой конструктор по умолчанию. В настоящее время нет способа настроить его иначе.

public final class ColumnDefinitionTypeResolver implements TypeIdResolver { 
    // You could rely on static state. 
    public static String SOME_ACCESSIBLE_OBJECT = null; 

    public ColumnDefinitionTypeResolver() { 
    // This is what gets called. 
    } 
} 

ColumnDefinitionTypeResolver.SOME_ACCESSIBLE_OBJECT = "I can affect the implementation from here, but using static state ... be careful"; 

2) Создает модуль для десериализации вашего типа и подтипов.

SimpleModule columnDefinitionModule = new SimpleModule("colDefMod", new Version(1, 0, 0, null)) 
     .addDeserializer(ColumnDefinition.class, new JsonDeserializer() { 
      @Override 
      public Object deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException { 
       // Need to read the type out and then use ObjectMapper to deserialize using the correct token 
      } 
     }) 
     .registerSubtypes(...); // add your subtypes here. 

(new ObjectMapper()).registerModule(columnDefinitionModule); 

Более подробные примеры см Jackson документацию How-To: Custom Deserializers.

Смежные вопросы