仅具有参数化构造函数的类的redisson中的对象deserializtion



我需要存储在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. 是否可以使用支持注释的蓖麻来生成Java类。

  2. 我可以在redisson客户端使用的任何其他序列化/次要化技术支持只有参数化构造函数的对象。

我的博客文章的摘要:

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

实现这一目标:

  • 通过将-parameters传递给javac
  • 编译
  • 包括并注册jackson-module-parameter-names

杰克逊将能够使用castor生成的非宣传构造函数。

相关内容

  • 没有找到相关文章

最新更新