ClassNotFoundException: RObject не найден, чтобы соответствовать типу класса org.redisson.RedissonMap с типом кодека org.redisson.codec.JsonJacksonCodec - PullRequest
0 голосов
/ 23 ноября 2018

Возникают проблемы с решением возникшего исключения LiveObject, я пытаюсь воспроизвести проблемное поведение на основе тестовых примеров Redisson.

Минимальный код, который я получаю, чтобы воспроизвести проблему, - это тестовый пример (в основном вдохновленный RedissonLiveObjectServiceTest.java):

public class LiveObjectTest {

    public static final String TEST_VALUE = "my test value";
    public static final Integer TEST_INTEGER = 30;

    private RedissonClient redisson;

    @BeforeEach
    public void beforeEach () {

        Config config = new Config();
        config.useSingleServer()
                .setAddress("http://127.0.0.1:6379");
        redisson = Redisson.create(config);
    }

    @AfterEach
    public void afterEach () {

        redisson.shutdown();
    }

    @Test
    @DisplayName("Test LiveObject with collection")
    public void testLiveObjectMap () {

        // Use Live Objects service
        RLiveObjectService service = redisson.getLiveObjectService();
        service.registerClass(TestREntityWithMap.class);

        TestREntityWithMap createdObject = new TestREntityWithMap("testID2");
        createdObject = service.persist(createdObject);

        RMap<Integer, String> map = redisson.getMap("testMap");
        createdObject.setValue(map);

        map.put(TEST_INTEGER, TEST_VALUE);

        TestREntityWithMap updatedObject = service.get(TestREntityWithMap.class, "testID");

        // Fails here to access updatedObject.getValue()
        assertEquals(TEST_VALUE, updatedObject.getValue().get(TEST_INTEGER));
    }

    // Tested class
    @REntity
    public static class TestREntityWithMap implements Comparable<TestREntityWithMap> {

        @RId(generator = UUIDGenerator.class)
        private String name;

        private Map<Integer, String> value;

        public TestREntityWithMap (String name) {

            super();
            this.name = name;
        }

        protected TestREntityWithMap () {

            super();
        }

        public String getName () {

            return name;
        }

        public void setName (String name) {

            this.name = name;
        }

        public  Map<Integer, String> getValue () {

            return value;
        }

        public  void setValue (Map<Integer, String> value) {

            this.value = value;
        }

        @Override
        public int compareTo (TestREntityWithMap o) {

            return name.compareTo(o.name);
        }

    }
}

Не удается преобразовать объект RedissonMap обратно в объект RObject ...
Не лучше ли попытаться преобразовать свойство значения в стандартное java.util.Map?

Это выглядиткак довольно простое использование API, я здесь что-то упускаю?

Вот моя установка ObjectMapper для JsonJackson:

ObjectMapper mapper = new ObjectMapper();
    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    mapper.configure(MapperFeature.DEFAULT_VIEW_INCLUSION, true);
    mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
    mapper.disable(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE);
    mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
    mapper.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);
    mapper.addMixIn(Throwable.class, JsonJacksonCodec.ThrowableMixIn.class);

    mapper.findAndRegisterModules();
    mapper.registerModule(new JavaTimeModule());

1 Ответ

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

ОК .... В случае, если кому-то это поможет, переход с Redisson 3.8.2 на 3.9.1 решит проблему.Несколько небольших изменений в API (RTopics, схема подключения ...), но оно того стоит!

...