gpt4 book ai didi

java - Redisson 中仅使用参数化构造函数的类的对象反序列化

转载 作者:太空宇宙 更新时间:2023-11-04 10:54:28 42 4
gpt4 key购买 nike

我有一个 java 对象(ComponentType.java),我需要将其存储在 Redis 中。我使用 Redisson 作为客户端库。该对象有一个实例变量(ComponentType),该变量只有一个私有(private)参数化构造函数。 ComponentType 类是使用castor 生成的。在 Redisson 中,序列化部分工作正常,但是当我尝试反序列化对象时,出现以下异常

Exception in thread "main" org.redisson.client.RedisException: Unexpected exception while processing command
at org.redisson.command.CommandAsyncService.convertException(CommandAsyncService.java:324)
at org.redisson.command.CommandAsyncService.get(CommandAsyncService.java:167)
at org.redisson.RedissonObject.get(RedissonObject.java:75)
at org.redisson.RedissonMap.put(RedissonMap.java:256)
at tester.RedissonIPWCTaskTester.populateMap(RedissonIPWCTaskTester.java:67)
at tester.RedissonIPWCTaskTester.main(RedissonIPWCTaskTester.java:51)
Caused by: com.fasterxml.jackson.databind.JsonMappingException: No suitable constructor found for type [simple type, class com.mae.component.valueobject.types.ComponentType]: can not instantiate from JSON object (missing default constructor or creator, or perhaps need to add/enable type information?)
at [Source: (io.netty.buffer.ByteBufInputStream); line: 1, column: 769] (through reference chain: com.mae.component.valueobject.ComponentVO["_type"])
at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:256)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1134)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:298)
at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther(BeanDeserializer.java:168)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:135)
at com.fasterxml.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer._deserializeTypedForId(AsPropertyTypeDeserializer.java:120)
at com.fasterxml.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer.deserializeTypedFromObject(AsPropertyTypeDeserializer.java:91)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeWithType(BeanDeserializerBase.java:1021)
at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:493)

手动修改ComponentType的构造函数如下解决异常

@JsonCreator
private ComponentType(@JsonProperty("type") int type, @JsonProperty("value") java.lang.String value) {
super();
this.type = type;
this.stringValue = value;
}

非常感谢您解答以下问题

  1. 有没有一种方法可以使用支持注释的castor生成java类。

  2. 我可以在 Redisson 客户端中使用的任何其他序列化/反序列化技术来支持仅具有参数化构造函数的对象。

最佳答案

我的blog post的总结:

使用 Java 8,您可以选择在编译的代码中包含构造函数元数据,Jackson 可以使用它,而不需要 @JsonCreator@JsonProperty

要实现这一点:

  • 编译时将-parameters传递给javac
  • 包含并注册jackson-module-parameter-names

然后 Jackson 将能够使用由 castor 生成的无注释构造函数。

关于java - Redisson 中仅使用参数化构造函数的类的对象反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47446418/

42 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com