ObjectMapper - чтение / запись универсального объекта - PullRequest
0 голосов
/ 16 ноября 2018

У меня есть сценарий, в котором я помещаю объект в очередь, который будет прочитан на другом конце.

Я конвертирую мой объект в строку, строку в байты.Выдвигаем эти байты в очередь.

        CollectionObject collectionObject = new CollectionObject();
        // This can be any Object. Or at least Iam thinking it's Object class.
        collectionObject.setName("Sienna");

        String customerMessage = objectMapper.writeValueAsString(collectionObject);
        byte[] msg = customerMessage.getBytes(StandardCharsets.UTF_8);

С другой стороны, я воспринимаю чтение этого объекта таким образом.

        String messageFromQueue = new String(msg);
        objectMapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);
        Object genericObject = objectMapper.readValue(messageFromQueue, new TypeReference<Object>(){});

        System.out.println("let's see object"+genericObject);
        if(genericObject instanceof CollectionObject)
            System.out.println("turned out to be collectionObject "+genericObject);

Но экземпляр проверки никогда не выполняется.ReadValue возвращает мне объект LinkedHashMap.

Любая помощь, спасибо

1 Ответ

0 голосов
/ 16 ноября 2018

Проблема

Нет ничего, что указывало бы на класс, по которому нужно выполнить маршал: {"name":"Sienna"}.Как мог бы fastxml, возможно, угадать, какой тип он должен маршалировать.

Одно решение

Сначала включите типизацию по умолчанию:

    objectMapper.enableDefaultTyping();

Затем рассмотрите возможность использованияобъект-обертка вокруг фактической полезной нагрузки:

public class Wrapper {

    private Object content;

    public Wrapper() {
    }

    public Wrapper(Object content) {
        this.content = content;
    }

    public Object getContent() {
        return content;
    }

    public void setContent(Object content) {
        this.content = content;
    }
}

Затем записать объект:

    String customerMessage = objectMapper.writeValueAsString(new Wrapper(collectionObject));

Затем прочитать объект:

    Object genericObject = objectMapper.readValue(messageFromQueue, Wrapper.class).getContent();

В этом случае genericObject будет CollectionObject, а JSON {"content":["CollectionObject",{"name":"Sienna"}]}

...