javers 比较对象中的列表给出不一致的结果

Jam*_*len 5 javers

我很难理解为什么以下内容没有给我相同的结果。

如果我使用 Javers 来比较两个列表(其中的项目顺序不同),那么我不会得到任何差异,因为我已指定 AS_SET 列表比较来忽略列表中项目的顺序。

如果我随后将这些列表包装为对象的属性,Javers 会返回列表的元素因列表中项目的顺序而不同。

AS_SET 应该应用于对象内的列表吗?就好像被忽视一样

public class App {
    public static void main(String[] args) {

        List<ListItem> list1 = ImmutableList.of(
                ListItem.builder()
                        .itemName("item1")
                        .itemValue("value")
                        .build(),
                ListItem.builder()
                        .itemName("item2")
                        .itemValue("value2")
                        .build()
        );

        List<ListItem> list2 = ImmutableList.of(
                ListItem.builder()
                        .itemName("item2")
                        .itemValue("value2")
                        .build(),
                ListItem.builder()
                        .itemName("item1")
                        .itemValue("value")
                        .build()
        );

        TopLevelClass tlc1 = TopLevelClass.builder().items(list1).build();
        TopLevelClass tlc2 = TopLevelClass.builder().items(list2).build();

        Diff diff = JaversBuilder.javers().withListCompareAlgorithm(ListCompareAlgorithm.AS_SET).build().compare(list1, list2);
        System.out.println(diff);

        Diff diffTlc = JaversBuilder.javers().withListCompareAlgorithm(ListCompareAlgorithm.AS_SET).build().compare(tlc1, tlc2);
        System.out.println(diffTlc);
    }
}
Run Code Online (Sandbox Code Playgroud)

以下类别:

package wibble;

import lombok.Builder;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;

@Builder
@Getter
@Setter
@EqualsAndHashCode
public class ListItem {
    private String itemName;
    private String itemValue;
}
Run Code Online (Sandbox Code Playgroud)
package wibble;

import lombok.Builder;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;

import java.util.List;

@Builder
@Getter
@Setter
@EqualsAndHashCode
public class TopLevelClass {
    List<ListItem> items;
}
Run Code Online (Sandbox Code Playgroud)

上述运行时的输出:

Diff:

Diff:
    * changes on wibble.TopLevelClass/ :
    - 'items/0.itemName' changed from 'item1' to 'item2'
    - 'items/0.itemValue' changed from 'value' to 'value2'
    - 'items/1.itemName' changed from 'item2' to 'item1'
    - 'items/1.itemValue' changed from 'value2' to 'value'
Run Code Online (Sandbox Code Playgroud)

kri*_*aex 1

免责声明:实际上我以前从未听说过JaVers,我只是偶然发现这个问题并感到好奇。所以我在这里完全是新手。

\n

查看JaVers 手册中的diff 示例,您会读到类似以下内容:

\n
\n

配置

\n

JaVers 需要知道该类Employee是一个Entity(...) It\xe2\x80\x99s 足以用注释@Id(...)

\n
\n

那么让我们试试这个:

\n
package wibble;\n\nimport lombok.*;\nimport org.javers.core.metamodel.annotation.Id;\n\n@Builder\n@Getter\n@Setter\n@EqualsAndHashCode\n@ToString\npublic class ListItem {\n  @Id\n  private String itemName;\n  private String itemValue;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

控制台日志变为:

\n
Diff:\n\nDiff:\n
Run Code Online (Sandbox Code Playgroud)\n