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