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