java - Javers 不报告对象层次结构中的引用更改

标签 java cas javers

问题陈述

我正在试验 Javers 3.5.1 报告已提交更改的能力。看来只有当变化是原始变化时才会被报告;当实体层次结构中的对象引用发生更改时,不会报告更改。

示例

这是一个示例:

    Javers javers = JaversBuilder.javers().build();

    RegexRegisteredService svc2 = new RegexRegisteredService();
    // Set a reference to something
    svc2.setUsernameAttributeProvider(new DefaultRegisteredServiceUsernameProvider());
    svc2.setId(345);
    javers.commit("345", svc2);

    // change the reference
    svc2.setUsernameAttributeProvider(new AnonymousRegisteredServiceUsernameAttributeProvider());
    javers.commit("345", svc2);

    List<Change> changes = javers.findChanges(QueryBuilder.byInstanceId("345", 
                               RegexRegisteredService.class).build());
    System.out.println(changes.size());

上述代码片段的结果是0。

诊断

进一步的诊断表明,包含类中的对象引用有自己的 id; findChanges()函数仅查看具有该 id 的包含类/实体,并且不会遍历层次结构以查找其他引用和属性。当 InMemoryRepository 开始将历史快照与传递的 globalId 进行比较时,它只会查看父 globalId,而不会向下查找包含的类列表:

    Iterator it = this.getAll().iterator();

    while(it.hasNext()) {
        CdoSnapshot snapshot = (CdoSnapshot) it.next();
        if (snapshot.getGlobalId().equals(globalId)) {
            filtered.add(snapshot);
        }
    ...

这里,globalId通过的是 org.apereo.cas.services.RegexRegisteredService/345 。然而,这个 id 中的任何内容都没有改变;真正改变的内容映射到 org.apereo.cas.services.RegexRegisteredService/345#usernameAttributeProvider由于上述检查未满足相等条件,因此永远不会检索到该内容。

层次结构如下:

public interface RegisteredService {}

public abstract class AbstractService implements RegisteredService {
   // with setters and getters
   private UsernameAttributeProviderInterface usernameAttributeProvider;
}

public class RegexRegisteredService extends AbstractService {}

替代方案?

像这样的东西怎么样?

    Iterator it = this.getAll().iterator();

    while(it.hasNext()) {
        CdoSnapshot snapshot = (CdoSnapshot) it.next();
        if (snapshot.getGlobalId().value().startsWith(globalId.value())) {
            filtered.add(snapshot);
        }
    ...

Javers 中是否缺少此功能,或者我错过了什么?想知道我是否应该设计自己的存储库类?

最佳答案

事实证明我需要做一些非常简单的事情:

final List<Change> changes = javers.findChanges(
            QueryBuilder.byInstanceId("345, RegexRegisteredService.class)
                    .withChildValueObjects()
                    .build());

引用: https://javers.org/documentation/jql-examples/#child-value-objects-filter

关于java - Javers 不报告对象层次结构中的引用更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46501398/

相关文章:

java - 在Android应用程序中实现webrtc

java - 在 eclipse 中创建 exc jar 文件?

java - CAS 4.2 获取LDAP属性

c# - 我无法让页面从 cookie 加载用户角色

attributes - CAS 和 Shibboleth Integration 将主体名称(用户名)作为 SAML 中的一个属性发布

java - 在新的 Google Apps Marketplace OAuth 2 流程下,您是否注册回调 URL?

java - 如果有除零以外的值,如何输入新字符串

java - 在javers中,你可以添加额外的条目吗

java - 如何使用 Javers 比较 hibernate BO 对象