【问题标题】:Why does spring Data REST ignore @javax.persistence.Version field while serializing an entity?为什么spring Data REST在序列化实体时忽略@javax.persistence.Version字段?
【发布时间】:2016-01-07 05:25:24
【问题描述】:

我查看了代码并注意到 org.springframework.data.rest.webmvc.json.PersistentEntityJackson2Module.$AssociationOmittingSerializerModifier.updateBuilder 只是跳过了 version 属性。

对于项目资源,版本字段在 ETag 标头中可用。 但是对于集合资源,我们需要项目的版本 id 以在更新项目时遵守乐观锁定。

我们如何获取集合资源上每个项目的版本 ID?我们是否有任何配置可以启用此功能?

感谢您的帮助

【问题讨论】:

  • 看看Projections and Excerpts,它可以帮助你。无论如何,如果您提供一些示例代码,例如您所涉及的实体,您得到的结果以及您想要的结果,我们可以制定一些具体的解决方案。
  • 你有没有想出正确的方法来做到这一点?
  • 不幸的是没有.. :(

标签: java spring spring-data spring-data-jpa spring-data-rest


【解决方案1】:

当返回集合资源并且您想要更新集合中的单个项目时,访问版本特别方便。

我在将返回版本的实体类中添加了一个替代名称“getter”:

@Version
private long version;

public long getCurrentVersion()
{
  return version;
}

这会导致序列化程序在返回的 JSON 中创建一个 currentVersion 键,然后我将其值作为 If-Match 标头的值传递。

【讨论】:

    【解决方案2】:

    您必须手动完成。出于我的目的,这很好用,因为无论如何我都会在更新之前加载现有实体,然后从 REST 实体复制属性。

        if (restEntity.version != null && restEntity.version != existing.version) {
            throw new OptimisticLockingFailureException("version number from REST doesn't match the database")
        }
    

    【讨论】:

      猜你喜欢
      • 2015-06-23
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 2015-07-15
      • 1970-01-01
      • 2019-07-02
      • 1970-01-01
      • 2017-01-15
      相关资源
      最近更新 更多