Spring boot JaVers给出的自定义列表差异结果不正确

Spring boot JaVers给出的自定义列表差异结果不正确,spring-boot,kotlin,javers,Spring Boot,Kotlin,Javers,我有一个类节点,它有一个设备列表。比如说 class Node { String nodeCode; String name; List devices; } class Device { String deviceCode; String name; } 我使用LEVENSHTEIN_距离算法比较两个节点对象,场景如下: 塞纳里奥-1。卸下设备1: Old Version:

我有一个类节点,它有一个设备列表。比如说

    class Node {
        String nodeCode;
        String name;
        List devices;
    }

    class Device {
        String deviceCode;
        String name;
    }
我使用LEVENSHTEIN_距离算法比较两个节点对象,场景如下:

塞纳里奥-1。卸下设备1:

 Old Version:
         var device1 = Device("d1", "device1")
         var device2 = Device("d2", "device2")
         var devices = mutableListOf<Device>()
         devices.add(device1)
         devices.add(device2)
         val before = Node("n1", "node1", devices)  // Old Version


 Current Version:
       var newDevice1 = Device("d1", "device1")
       var newDevices = mutableListOf<Device>()
       newDevices.add(newDevice1)
       var after = Node("n1", "node1", newDevices) // New Version

 Compare both version:
 var diff = javers.compare(before, after)
 println("$diff")

Output:

changes on com.example.audit.Node/ :
'devices' collection changes :
1. 'com.example.audit.Node/#devices/1' removed
  Old Version:
       var newDevice1 = Device("d1", "device1")
       var newDevices = mutableListOf<Device>()
       newDevices.add(newDevice1)
       var after = Node("n1", "node1", newDevices) // Old Version

  Current Version:
       var device1 = Device("d1", "device1") 
       var device2 = Device("d2", "device2")
       var devices = mutableListOf<Device>()
       devices.add(device1)
       devices.add(device2)
       val after1 = Node("n1", "node1", devices)  // New Version

  Compare both version:
  var diff = javers.compare(after, after1)

Output:

changes on com.example.audit.Node/ :
'devices' collection changes :
1. 'com.example.audit.Node/#devices/1' added
  Old Version:
       var device1 = Device("d1", "device1") 
       var device2 = Device("d2", "device2")
       var devices = mutableListOf<Device>()
       devices.add(device1)
       devices.add(device2)
       val after1 = Node("n1", "node1", devices)  //Old Version

 Current Version:
      device2 = Device("d2", "device2") 
      var newDevices2 = mutableListOf<Device>()
      newDevices2.add(device2)
      val after2 = Node("n1", "node1", newDevices2) // New Version

    Compare both version:
    diff = javers.compare(after1, after2)

Output:

changes on com.example.audit.Node/ :
'devices' collection changes :
1. 'com.example.audit.Node/#devices/1' removed
JaVers对自定义对象列表有限制吗

我错过了原型中的第三个场景。我去了,并融入到我的项目中,改变被转移到了舞台上。这是阻止我释放


你能提供你的输入吗?为了得到预期的结果,我必须进行哪些更改?

JaVers工作正常,你误用了
值对象。值对象列表不便于比较,因为值对象(根据定义)没有标识。当您将列表中的对象映射为
值时,可以得到预期的结果

(Groovy)


为什么使用非参数化列表?自Java7以来,这是一个糟糕的做法,对Javers来说绝对不好。Javes不会猜测<代码>列表设备<代码>是一个设备列表,但简单地将它视为对象列表。LevsHeTeNixListin算法不应该考虑索引。但如果你看到上面提到的第三个场景输出,它仍然在考虑索引。我只是给出了一个例子,但我在我的类中使用了它列表推送一个可运行的测试用例,就像这里我的程序---@Bartekwalacik我们能得到下面提到的输出吗?`员工/佛罗多的更改:-“地址列表”集合更改:0员工/#地址列表/0'已删除``
changes on com.example.audit.Node/ :
'devices' collection changes :
0. 'com.example.audit.Node/#devices/0' removed
package org.javers.core.cases

import org.javers.core.JaversBuilder
import org.javers.core.diff.ListCompareAlgorithm
import org.javers.core.diff.changetype.container.ListChange
import org.javers.core.metamodel.annotation.Id
import org.javers.core.metamodel.annotation.TypeName
import spock.lang.Specification

import static java.util.Objects.equals

class shivusajjan extends Specification {

    @TypeName("Address")
    class Address {
        String city
        String street

        Address(String city, String street) {
            this.city = city
            this.street = street
        }

        @Override
        String toString() {
            return "Address{" +
                    "city='" + city + '\'' +
                    ", street='" + street + '\'' +
                    '}';
        }
    }

    @TypeName("Employee")
    class EmployeeClass {
        @Id String name
        List<Address> addressList

        EmployeeClass(String name, List<Address> addressList) {
            this.name = name
            this.addressList = addressList
        }
    }

    def "should compare list of Values using LEVENSHTEIN_DISTANCE"() {
        given:
        def javers = JaversBuilder.javers()
                .withListCompareAlgorithm(ListCompareAlgorithm.LEVENSHTEIN_DISTANCE)
                .registerValue(
                        Address,
                        { a, b -> equals(a.city, b.city) && equals(a.street, b.street) },
                        {a -> a.toString() }
                )
                .build()

        def previousAddresses = [ new Address("Bangalore", "Vinayaka"),
                                  new Address("Bangalore", "Vijayanagar")]
        def previousEmp = new EmployeeClass("Frodo", previousAddresses)

        def currentAddresses = [ new Address("Bangalore", "Vijayanagar") ]
        def newEmp = new EmployeeClass("Frodo", currentAddresses)

        when:
        def diff = javers.compare(previousEmp, newEmp)

        then:
        println diff.prettyPrint()
        ListChange change = diff.getChangesByType(ListChange)[0]
        change.changes[0].index == 0
    }
}
Diff:
* changes on Employee/Frodo :
  - 'addressList' collection changes :
    0. 'Address{city='Bangalore', street='Vinayaka'}' removed