Spring Data REST 默认对 JSON 隐藏技术实体字段(@Version、@Id)。如何将它们作为通常的属性返回?

Posted

技术标签:

【中文标题】Spring Data REST 默认对 JSON 隐藏技术实体字段(@Version、@Id)。如何将它们作为通常的属性返回?【英文标题】:Spring Data REST hides technical entity fields (@Version, @Id) from JSON by default. How to return them as usual properties? 【发布时间】:2018-05-22 21:41:45 【问题描述】:

我有一个基类

@MappedSuperclass
@Data //lombok annotation for getters/setter
public class BaseEntity implements Identifiable<Long> 
    @Id @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Version
    private Long version;

对于任何派生类,Spring Data REST 返回没有“id”和“version”属性的 JSON。

我找到了 2 个解决方案:

    预测。

    添加其他名称的 getter/setter:

    public Long getRevision() 
        return version;
    
    
    public void setRevision(Long revision) 
        this.version = revision;
    
    
    public Long getIdentifier() 
        return id;
    
    
    public void setIdentifier(Long identifier) 
        this.id = identifier;
    
    

这两种解决方案看起来都像 hack。是否存在更好的方法?

【问题讨论】:

公开 ids 已解决和回答 here, here, here, here...公开版本已解决 here。 感谢您发布您的 MappedSuperclass 代码,它帮助我弄清楚我没有向它添加 Data 注释,即使它是针对我的实体类注册的。截至 2020 年 3 月,这就是我需要添加的全部内容,不需要所有其他“exposeIds”技术,它们(不出所料)也没有解决我的问题。 【参考方案1】:

显示实体的ID是在RepositoryRestConfigurerAdapter中配置的:

@Bean
public RepositoryRestConfigurerAdapter repositoryRestConfigurerAdapter() 
    return new RepositoryRestConfigurerAdapter() 
        /**
         * Exposing ID for some entities
         */
        @Override
        public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) 
            config.exposeIdsFor(MyEntity.class);            
            super.configureRepositoryRestConfiguration(config);
        

    ;

【讨论】:

谢谢!那么@Version 呢? 我认为您不需要它 - JPA 提供程序直接使用它... 我想对嵌套资源应用乐观锁定。如果没有版本,我只能将 If-Match 应用于***资源。

以上是关于Spring Data REST 默认对 JSON 隐藏技术实体字段(@Version、@Id)。如何将它们作为通常的属性返回?的主要内容,如果未能解决你的问题,请参考以下文章

Jason中的Spring Data Rest -Disable自我链接(HAL)

spring-data-rest 集成测试因简单的 json 请求而失败

纯 JSON(非 HAL 格式)的 Spring Data REST

Spring Data REST 在哪里构建异常 JSON 回复?

Spring data rest @ManyToOne 字段不在 json 中

从 Spring Data REST 返回 JSON 响应中的 ID