NullPointerException при использовании десериализации GWT AutoBean с HashMap - PullRequest
4 голосов
/ 11 февраля 2012

У меня возникли проблемы с сериализацией и десериализацией Google AutoBean.У меня есть AutoBean, который содержит примитивные типы и карты.Я могу без проблем сериализовать и десериализовать примитивные типы, но когда я пытаюсь прочитать десериализованную Карту, я получаю NullPointerExceptionВы когда-нибудь сталкивались с подобной проблемой раньше?Есть тест JUnit, который представляет мою проблему.Первые два утверждения являются пропусками, но третье не выполняется.

public class AutoBeanTest {

    @Test
    public void test() throws Exception {
        MyFactory myFactory = AutoBeanFactorySource.create(MyFactory.class);

        Options options = myFactory.options().as();
        options.setMyInt(5);
        HashMap<Double, Boolean> map = newHashMap();
        map.put(8.0, true);
        map.put(9.1, false);

        options.setMyMap(map);

        Options deserialized = AutoBeanCodex.decode(myFactory, Options.class, AutoBeanCodex.encode(AutoBeanUtils.getAutoBean(options)).getPayload()).as();
        assertEquals(deserialized.getMyInt(),5);
        assertTrue(options.getMyMap().containsKey(8d));
        assertTrue(deserialized.getMyMap().containsKey(8d));
    }

    public interface MyFactory extends AutoBeanFactory {
        AutoBean<Options> options();
    }

    public interface Options {

        public int getMyInt();

        void setMyInt(int myInt);

        Map<Double, Boolean> getMyMap();

        void setMyMap(Map<Double, Boolean> myMap);
    }
}

Ответы [ 2 ]

2 голосов
/ 12 апреля 2012

Я играл с функциональностью AutoBean некоторое время назад. Я думаю, что это все еще вид глючит. Я вполне уверен, что исключения вызваны ошибкой в ​​коде AutoBean, а не в вашем коде.

Если вы запустите приведенный выше пример кода в отладчике и проверите сгенерированный JSON, все выглядит хорошо. Вы даже можете позвонить deserialized.getMyMap().size() и получить правильное значение, но как только вы захотите получить доступ к содержимому, возникают ошибки.

Существует обходной путь, просто используйте Map<String, String> вместо Double или Boolean, и он работает ...

1 голос
/ 14 мая 2019

Условно ... Autobeans делает это правильно, так как в JSON допускаются только строки в качестве ключей .Но, конечно, сообщение об ошибке должно быть более полезным.

...