Javers中如何查看NewObject变更关联属性及对象图完整路径?
关于Javers框架的两个问题解答
1. 查看NewObject类型变更指向的具体属性
NewObject类型的变更本质上代表整个对象被新增到对象图中,它不像PropertyChange那样直接关联单个属性,但你可以通过以下方式获取新对象的属性信息:
- 首先通过
change.getAffectedGlobalId()拿到新对象的全局ID; - 利用Javers的快照查询API加载该对象的完整数据,比如:
List<Snapshot> snapshots = javers.findSnapshots(Query.byGlobalId(change.getAffectedGlobalId())); if (!snapshots.isEmpty()) { // 从快照中获取对象的所有属性和值 Map<String, Object> properties = snapshots.get(0).getState(); // 遍历处理属性 properties.forEach((key, value) -> System.out.println("属性:" + key + ",值:" + value)); } - 如果你是在
ChangeProcessor的实现类中,也可以直接通过Javers实例查询新对象的当前状态(如果对象仍在内存中)。
2. 获取新对象在对象图中的完整路径
当然可以!默认的全局ID只显示类型和实例标识,但Javers的GlobalId其实包含了对象的层级关系信息,你可以通过递归遍历GlobalId的owner信息来拼接出完整路径:
实现思路:
每个嵌套对象(比如你提到的Address)的GlobalId如果是ValueObjectId类型,会包含ownerId(父对象的全局ID)和propertyName(父对象中指向该嵌套对象的属性名)。通过递归向上追溯owner,就能拼接出从顶层对象到当前对象的完整路径。
示例代码:
public class CustomChangeProcessor implements ChangeProcessor { private Javers javers; public CustomChangeProcessor(Javers javers) { this.javers = javers; } @Override public void onNewObject(NewObject change) { GlobalId globalId = change.getAffectedGlobalId(); String fullPath = buildFullPath(globalId); System.out.println("新对象的完整路径:" + fullPath); } private String buildFullPath(GlobalId globalId) { // 处理顶层实体对象(InstanceId类型) if (globalId instanceof InstanceId) { InstanceId instanceId = (InstanceId) globalId; return instanceId.getTypeName() + "/" + instanceId.getValue(); } // 处理嵌套值对象(ValueObjectId类型) if (globalId instanceof ValueObjectId) { ValueObjectId voId = (ValueObjectId) globalId; // 递归拼接父路径 + 当前属性名 return buildFullPath(voId.getOwnerId()) + "." + voId.getPropertyName(); } // 其他类型的GlobalId直接返回其字符串表示 return globalId.value(); } // 实现其他ChangeProcessor方法... }
这样处理后,你就能得到类似User/123.homeAddress或User/123.workAddress的完整路径,轻松区分两个Address对象了。
内容的提问来源于stack exchange,提问作者Stef
相关产品推荐
相关产品推荐

