Redisson中的对象反序列化对于仅具有参数化构造函数的类

时间:2017-11-23 01:52:53

标签: java jackson castor redisson

我有一个需要存储在Redis中的java对象(ComponentType.java)。我使用Redisson作为客户端库。该对象有一个实例变量(ComponentType),它只有一个私有参数化构造函数。 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客户端中使用任何其他序列化/反序列化技术来支持仅具有参数化构造函数的对象。

1 个答案:

答案 0 :(得分:0)

我的blog post摘要:

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

实现这一目标:

  • -parameters传递给javac
  • 进行编译
  • 包含并注册jackson-module-parameter-names
然后,杰克逊将能够使用由castor生成的非注释构造函数。