簡體   English   中英

Redisson中僅具有參數化構造函數的類的對象反序列化

[英]Object deserializtion in Redisson for a class with only parameterized constructor

我有一個Java對象(ComponentType.java)需要存儲在Redis中。 我正在使用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進行javac
  • 包括並注冊jackson-module-parameter-names

然后,Jackson將能夠使用castor生成的非注釋構造函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM