jjzjj

java - ClassNotFoundException : No RObject is found to match class type of org. redisson.RedissonMap 编解码器类型为 org.redisson.codec.JsonJacksonCodec

coder 2023-07-19 原文

在解决 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...
它不应该尝试将 value 属性转换为标准 java.util.Map 吗?

这看起来像是 API 的简单用法,我是否遗漏了一些要点?

这是我为 JsonJackson 设置的 ObjectMapper:

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());

最佳答案

好的.... 为了帮助任何人,从 Redisson 3.8.2 切换到 3.9.1 解决了这个错误。 API(RTopics、连接方案...)中的一些小变化,但非常值得!

关于java - ClassNotFoundException : No RObject is found to match class type of org. redisson.RedissonMap 编解码器类型为 org.redisson.codec.JsonJacksonCodec,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53449499/

有关java - ClassNotFoundException : No RObject is found to match class type of org. redisson.RedissonMap 编解码器类型为 org.redisson.codec.JsonJacksonCodec的更多相关文章

随机推荐