当前位置:  开发笔记 > 运维 > 正文

在使用Spring Data REST存储库时,如何确定RESTful资源的哪些属性在保存之前已更改?

如何解决《在使用SpringDataREST存储库时,如何确定RESTful资源的哪些属性在保存之前已更改?》经验,为你挑选了1个好方法。

如果我有Spring Data REST发布的以下资源...

{ "status": "idle" }

我怎么能对改变属性值的PATCH或PUT做出反应status?想法是基于属性更改触发一些服务器进程.

理想情况下,这将在保存之前发生,并且可以将新版本的资源与先前持久的版本进行比较.



1> Mathias Dpun..:

您通常会使用a @RepositoryEventHandler来连接事件逻辑 - 有关详细信息,请参阅文档.

我不知道直接获取更改的属性的函数.但是如果使用HandleBeforeSave处理程序,则可以加载持久化实体(旧状态)并将其与新状态进行比较 -

    @RepositoryEventHandler 
    @Component
    public class PersonEventHandler {

      ...

      @PersistenceContext
      private EntityManager entityManager;

      @HandleBeforeSave
      public void handlePersonSave(Person newPerson) {
        entityManager.detach(newPerson);
Person currentPerson = personRepository.findOne(newPerson.getId());
        if (!newPerson.getName().equals(currentPerson.getName)) {
          //react on name change
        }
       }
    }

请注意,您需要从当前的EntityManager中分离newPerson.否则,我们会在调用findOne时获取缓存的人对象 - 我们无法与当前数据库状态的更新版本进行比较.

如果使用Eclipselink,则另行选择

如果您使用的是eclipselink,您还可以更有效地找到已应用于您的实体的更改,避免重新加载 - 有关详细信息,请参阅此处

        UnitOfWorkChangeSet changes = entityManager.unwrap(UnitOfWork.class).getCurrentChanges();
        ObjectChangeSet objectChanges = changes.getObjectChangeSetForClone(newPerson);
        List changedAttributeNames = objectChanges.getChangedAttributeNames();
        if (objectChanges.hasChangeFor("name")) {
            ChangeRecord changeRecordForName = objectChanges.getChangesForAttributeNamed("name");
            String oldValue = changeRecordForName.getOldValue();

        }


如果我将EntityManager注入到使用@PersistenceContext注释的PersonEventHandler中,并在currentPerson查询之前执行entityManager.detach(newPerson),这将按预期工作.如果您更新代码以反映这一点,我会接受您的回答.
感谢@GabrielBauman的提示 - 你是绝对正确的 - 我们的查找器不会进入数据库但返回已经在EntityManager中注册的person对象 - 能够与之前需要分离对象的当前状态进行比较.我相应地更新了答案.
推荐阅读
小白也坚强_177
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有