Spring Data Redis Repository 支持不回读嵌入的复杂对象

Posted

技术标签:

【中文标题】Spring Data Redis Repository 支持不回读嵌入的复杂对象【英文标题】:Spring Data Redis Repository support does not read back embedded complex objects 【发布时间】:2016-11-30 09:45:22 【问题描述】:

我有一个使用 spring-boot-starter-redis 的 spring-boot 应用程序(1.4RC1,我知道它是 RC,但 Spring Data Redis 1.7.2 不是)。

应用程序使用 Spring Data Repository (CrudRepository),它应该保存一个具有 StringBoolean 属性的对象(使用 @RedisHash 注释)和一个自定义类属性,该属性也只有 StringsLongs 作为属性。

当我保存一个对象(通过存储库)时,一切都很好,我可以看到数据库中的所有属性,正如我所期望的那样。 当我想从数据库中读取数据时(通过存储库),我只从父对象中获取属性。自定义类属性为空。

我也希望从数据库中加载属性。正如文档所述,您可以编写custom converter,但由于我不需要这样做,所以当我想写入数据时,我也不应该需要编写读取转换器。

我想知道是否需要注释自定义类属性,但我在文档中找不到任何内容。你能指出我正确的方向吗?

类如下:

类示例:

@Data
@EqualsAndHashCode(exclude = "isActive", "sampleCreated", "sampleConfiguration")
@RedisHash
public class Sample 

    @Id
    private String sampleIdentifier;

    private Boolean isActive;

    private Date sampleCreated;

    private SampleConfiguration sampleConfiguration;

    public Sample(String sampleIdentifier, SampleConfiguration sampleConfiguration)
        this.sampleIdentifier = sampleIdentifier;
        this.sampleConfiguration = sampleConfiguration;
    


类示例配置:

@Data
public class SampleConfiguration 

    private String surveyURL;

    private Long blockingTime;

    private String invitationTitle;

    private String invitationText;

    private String participateButtonText;

    private String doNotParticipateButtonText;

    private String optOutButtonText;

    private Long frequencyCappingThreshold;

    private Long optOutBlockingTime;


【问题讨论】:

向我们展示您的实体类。 你看过examples project。嵌入对象Address 在此test 中被正确回读。您是否介意为您的实体添加一个默认构造函数只是为了检查这是否可能是原因,并可能在Jira 中打开一个问题。 【参考方案1】:

按照 Christoph Strobl 的建议,我将 @NoArgsConstructor 添加到了我的 Sample 课程中。然后存储库正确读取SampleConfiguration。谢谢,克里斯托夫!

【讨论】:

我创建了DATAREDIS-544 来解决这个问题。

以上是关于Spring Data Redis Repository 支持不回读嵌入的复杂对象的主要内容,如果未能解决你的问题,请参考以下文章

spring-data-redis 中的HashOperations为啥有三个参数

Spring Data Redis 管理Redis 之1

Spring整合Redis(spring-data-redis)

spring-data-redis

聊聊spring-boot-starter-data-redis的配置变更

spring-boot-data-redis,使用redisson作为redis客户端