1

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

2 回答 2

2

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

于 2018-11-26T13:53:00.557 回答
0

截至目前最新的redisson

<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson</artifactId>
    <version>3.13.4</version>
</dependency>

最新的 Jackson jackson.version 属性2.11.2适合我

    <!-- faster JSON -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>${jackson.version}</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>${jackson.version}</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>${jackson.version}</version>
    </dependency>

更新 Eclipse 参考

eclipse:eclipse -U
于 2020-09-24T08:31:14.257 回答