Gab*_*man 3 spring spring-data spring-data-rest
如果我有Spring Data REST发布的以下资源...
{ "status": "idle" }
我怎么能对改变属性值的PATCH或PUT做出反应status
?想法是基于属性更改触发一些服务器进程.
理想情况下,这将在保存之前发生,并且可以将新版本的资源与先前持久的版本进行比较.
您通常会使用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
}
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,您需要从当前的EntityManager中分离newPerson.否则,我们会在调用findOne时获取缓存的人对象 - 我们无法与当前数据库状态的更新版本进行比较.
如果使用Eclipselink,则另行选择
如果您使用的是eclipselink,您还可以更有效地找到已应用于您的实体的更改,避免重新加载 - 有关详细信息,请参阅此处
UnitOfWorkChangeSet changes = entityManager.unwrap(UnitOfWork.class).getCurrentChanges();
ObjectChangeSet objectChanges = changes.getObjectChangeSetForClone(newPerson);
List<String> changedAttributeNames = objectChanges.getChangedAttributeNames();
if (objectChanges.hasChangeFor("name")) {
ChangeRecord changeRecordForName = objectChanges.getChangesForAttributeNamed("name");
String oldValue = changeRecordForName.getOldValue();
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
579 次 |
最近记录: |