2

我正在使用 JaVers v3.0.0 比较包含对象列表的两个对象。我正在比较的对象在列表的内容上有所不同,例如从列表中删除了一个对象。

执行此比较时,我得到两个更改对象:一个 ListChange 和一个 ObjectRemoved。

在呈现结果时,我需要确保相同的更改不会出现两次。我很难弄清楚如何识别或避免我得到的这些重复。我曾尝试使用 GlobalID,但最终解析的字符串并不完全安全。我也尝试过从演示文稿中跳过 ListChange 或 ObjectRemoved,但是当我也有值列表的 ListChange 或不在列表中的对象的 ObjectRemoved 时,就会出现问题。

@Test
public void javersDuplicateDiffResult() {

    MyMainObj objA = new MyMainObj(Arrays.asList(new MyListedObj("hello"), new MyListedObj("world")));
    MyMainObj objB = new MyMainObj(Arrays.asList(new MyListedObj("hello")));

    Javers javers = JaversBuilder.javers()
            .withListCompareAlgorithm(ListCompareAlgorithm.LEVENSHTEIN_DISTANCE)
            .build();
    Diff res = javers.compare(objA, objB);

    System.out.println(res);

    Assert.assertEquals(1, res.getChanges().size());
}

class MyMainObj {
    private List<MyListedObj> theObjectList;

    public MyMainObj(List<MyListedObj> anObjectList) {
        this.theObjectList = anObjectList;
    }
}

class MyListedObj {
    private String theText;

    public MyListedObj(String aText) {
        this.theText = aText;
    }
}

以下是运行上述示例代码的输出:

Diff:
1. ObjectRemoved{globalId:'org.example.TestJavers$MyMainObj/#theObjectList/1'}
2. ListChange{globalId:'org.example.TestJavers$MyMainObj/', property:'theObjectList', containerChanges:[(1).removed:'org.example.TestJavers$MyListedObj@2aece37d']}


java.lang.AssertionError: 
Expected :1
Actual   :2
4

2 回答 2

0

据我所知,在 Javers 中没有办法实现这一点。我通过根据更改路径过滤掉重复的差异解决了类似的问题。这是如何

  1. 确定更改的路径(列表更改或值更改)您必须编写代码来生成路径

  2. 如果路径是子路径路径Object Removed或者Value Removed则忽略它

在您的情况下,
Diff1:ObjectRemoved 路径:theObjectList/1
Diff2:ValueRemoved 路径:theObjectList/1/MyListedObj@2aece37d

您可以丢弃 Diff2,因为该路径是已删除对象的子路径。

ValueRemoved 路径是通过将 ListChange 路径与 Value Change 路径连接起来构建的

于 2019-05-07T08:10:52.060 回答
0

在 JaVers 中,ObjectRemoved通知您一个对象从左侧的对象图中消失了。WhileListChange->ValueRemovedPropertyChange通知对象图中发生更改的具体位置。

这两个更改涉及同一个对象(删除了一个),但不是重复的。

例如:

Class A {
  List<B> listOfB
  B bRef
}

如果你比较:

def b1 = new B()
javers.compare( new A(listOfB:[b1], bRef:b1), new A(listOfB:[], bRef:null) )

您将有三个变化:

  • b1 ObjectRemoved(一般信息)
  • b1 ListChange->ValueRemovedon listOfBproperty(对象图中的特定位置)
  • ValueChanged从 b1 到 nullbRef属性(对象图中的另一个特定位置)

我可以建议您只是忽略ObjectRemoved更改并仅依赖PropertyChanges( ListChange, ValueChange...)

于 2017-02-15T20:50:10.380 回答