java - 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());
解决方案
好的......如果对任何人有帮助,从 Redisson 3.8.2 切换到 3.9.1 解决了这个错误。API 中的一些小改动(RTopics、连接方案...)但非常值得!
推荐阅读
- python - ValueError:在 feed_dict tensorflow 中设置具有序列的数组元素
- c++ - 加速 Cuda 程序
- python - 在 Python 中解析 Discord Bot 的 JSON 输出
- android - 将模块导入 Android 项目后,Gradle Build 失败
- django - 尝试使用 AWS S3 将 Django React 应用程序部署到 Heroku 时出现错误的 STATIC_URL
- c++ - Opencv从控制中删除轮廓(椭圆)
- r - 增加`emmeans`比较箭头的粗细
- javascript - 动态添加元素中的元素引用导致 ExpressionChangedAfterItHasBeenCheckedError:
- android - ARM 汇编语言 - Android
- python-3.x - 通过smtp python发送电子邮件时如何替换发件人信息