首页 > 解决方案 > ClassNotFoundException:没有找到与 org.redisson.RedissonMap 的类类型与 org.redisson.codec.JsonJacksonCodec 的编解码器类型匹配的 RObject

问题描述

在解决 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());

标签: javaredisredisson

解决方案


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


推荐阅读