Как узнать, какой класс десериализуется в Десериализаторе JackSon - PullRequest
1 голос
/ 04 февраля 2012

Я использую хранилище данных движка приложений, поэтому у меня есть такая сущность.

@PersistenceCapable
public class Author {

    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    @JsonProperty("id")
    @JsonSerialize(using = JsonKeySerializer.class)
    @JsonDeserialize(using = JsonKeyDeserializer.class)
    private Key key;

    ....
}

Когда модель отправляется на просмотр, она сериализует объект Key как значение Id. Затем, если я отправляю данные обратно из представления, я хочу десериализовать Id обратно в объект Key, используя JsonKeyDeserializer class.

public class JsonKeyDeserializer extends JsonDeserializer<Key> {

    @Override
    public Key deserialize(JsonParser jsonParser, DeserializationContext deserializeContext)
            throws IOException, JsonProcessingException {
        String id = jsonParser.getText();
        if (id.isEmpty()) {
            return null;
        }

        // Here is the problem because I have several entities and I can't fix the Author class in this deserializer like this. 
        // I want to know what class is being deserialized at runtime.

        // return KeyFactory.createKey(Author.class.getSimpleName(), Integer.parseInt(id))
    }
}

Я попытался отладить значение в параметрах десериализации, но не могу найти способ получить целевой десериализованный класс. Как я могу решить это?

1 Ответ

0 голосов
/ 05 февраля 2012

Возможно, вы неправильно поняли роль KeySerializer / KeyDeserializer: они используются для ключей Java Map, а не в качестве общих идентификаторов в смысле базы данных в качестве термина «ключ». Таким образом, вам, вероятно, придется использовать обычный JsonSerializer / JsonDeserializer.

Что касается типа: предполагается, что обработчики созданы для определенных типов, и никакая дополнительная информация о типе не передается во время процесса сериализации или десериализации: ожидаемый тип (если обработчики используются для различных типов) должен быть передан во время построения. При регистрации общих сериализаторов или десериализаторов вы можете сделать это при реализации Module, поскольку одним из аргументов является тип, для которого запрашивается (де) сериализатор.

При определении обработчиков непосредственно для свойств (например, при использовании аннотаций) эта информация доступна при createContextual() обратном вызове интерфейса ContextualSerializer (и -Deserializer), если ваш обработчик реализует его: BeanProperty передается для указания свойства (в этом случае поле с аннотацией), и вы можете получить доступ к его типу. Эта информация должна быть сохранена для использования во время (де) сериализации.

РЕДАКТИРОВАТЬ : как указал автор, я действительно неправильно понял вопрос: KeySerializer - это имя класса, а не аннотация.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...