【问题标题】:Spring Redis JSON serializer embeds referenced fieldSpring Redis JSON 序列化程序嵌入引用字段
【发布时间】:2016-11-28 00:44:48
【问题描述】:

我有一个类有很多简单的属性(类型是int,String,...)。它还有一个属性,它是我的另一个类的实例。现在我想通过 Redis 发布/订阅通道发送对象。为此,我使用GenericJackson2JsonRedisSerializer 对其进行序列化。由于两个类都有自己的存储库,我不想每次都嵌入对象,而是只发送 ID。我认为这应该可以通过在字段中添加org.springframework.data.annotation.Reference 注释来实现。

不幸的是,这不起作用,它只是嵌入了对象。有什么我做错了吗?我需要做什么才能在序列化版本中获取对象的 ID?

感谢您的帮助!

【问题讨论】:

    标签: java json spring-data spring-data-redis jackson2


    【解决方案1】:

    你使用过 Spring Data Redis 吗? http://projects.spring.io/spring-data-redis/

    查看http://docs.spring.io/spring-data/redis/docs/current/reference/html/#redis.repositories.references

    如果您不使用 Spring Data Redis,我认为您应该在序列化/反序列化数据时实现自己的引用。

    你可以用

    实现你自己的序列化器

    YourObjectSerializer 扩展了 Jackson2JsonRedisSerializer

    【讨论】:

    • 是的,我正在使用 Spring Data Redis,我将尝试您的建议并告知您它是否有效。
    • 想通了,如果它不能以任何其他方式工作,编写自定义序列化程序也是我的方法。无论如何感谢您的帮助!
    【解决方案2】:

    好吧,在对这样一个基本的事情进行了太多研究之后,我终于想出了如何去做。

    基本上我需要将com.fasterxml.jackson.annotation.JsonIdentityInfo 注释添加到类或字段中。正如问题中已经说明的那样,这产生了相同的结果,第一次完全包括在内,后来才被引用。

    没有文档提到如何始终拥有 id,我不得不查看代码:还有另一个注释 com.fasterxml.jackson.annotation.JsonIdentityReference,它有一个名为 alwaysAsId 的布尔属性。如果将此设置为 true,它总是添加 id 而不是对象。

    要使反序列化工作,需要为 id 指定一个自定义解析器。由于我使用的是 Spring,因此访问我的存储库非常容易。

    【讨论】:

      猜你喜欢
      • 2018-09-23
      • 2013-02-25
      • 1970-01-01
      • 1970-01-01
      • 2017-12-07
      • 1970-01-01
      • 2017-07-21
      • 2018-10-06
      • 1970-01-01
      相关资源
      最近更新 更多