Protocol buffers Protobuf3Java:如何仅区分和更新输入对象中的字段?场景:例如持久化到数据库

Protocol buffers Protobuf3Java:如何仅区分和更新输入对象中的字段?场景:例如持久化到数据库,protocol-buffers,protobuf-java,Protocol Buffers,Protobuf Java,在下面的代码中,api在POST body中获得一个“Person”obj 我的技术要求: 若只发送了一个Person字段,那个么只能将该字段与db中的object进行比较 若有更改,则调用save(),若不只是从db返回对象 如何将下面的代码更改为更加通用和干净。任何与对象类型无关的实用程序方法 public Model.Person保存(Model.Person in){ 字符串updateId=in.getId(); System.out.println(“updateId=“+upd

在下面的代码中,api在POST body中获得一个“Person”obj

我的技术要求:

  • 若只发送了一个Person字段,那个么只能将该字段与db中的object进行比较
  • 若有更改,则调用save(),若不只是从db返回对象
  • 如何将下面的代码更改为更加通用和干净。任何与对象类型无关的实用程序方法
public Model.Person保存(Model.Person in){
字符串updateId=in.getId();
System.out.println(“updateId=“+updateId”);
Model.Person pExisting=get(updateId);
Model.Person.Builder exturaild=Model.Person.newBuilder(pExisting);
布尔hasChange=false;
//仅更改帖子正文中提供的字段。
//TODO不要比较createTs和updateTs——它们在更新的POST中没有提供。
if(!in.getFirstName().isEmpty()){//TODO-查找protobuf java中是否存在泛型util。
如果(!Objects.equals(在.getFirstName()中,存在.getFirstName())){
setFirstName(在.getFirstName()中);
hasChange=true;
}
}
如果(!in.getLastName().isEmpty()){
如果(!Objects.equals(在.getLastName()中,存在.getLastName()){
setLastName(在.getLastName()中);
hasChange=true;
}
}
如果(!hasChange){
System.out.println(“无需更新…”+System.currentTimeMillis());
回归现实;
}
final Model.Person updatePerson=outhild.build();
map.put(updateId,updatePerson);//稍后要移动到H2或postgres
返回更新人员;
}
样本模型

syntax=“proto3”;
导入“google/protobuf/timestamp.proto”;
导入“google/protobuf/any.proto”;
包my.model;
选项java\u outer\u classname=“Model”//muni.api.Model
选项java\u generic\u services=false//默认情况下,防止复杂的泛型
选项java\u multiple\u files=false//默认行为
信息员{
//仅输出
字符串id=3;
字符串firstName=4;
字符串lastName=5;
ContactChannel ContactChannel=8;
//仅输出
google.protobuf.Timestamp createTime=1;
//仅输出
google.protobuf.Timestamp updateTime=2;
}

是proto2、proto3还是proto3提供了新的实验性“可选”支持?这有点重要(因为你根本不能(可靠地)为中间的那个做这件事)@MarcGravel,我用的是proto3。编辑标题&包含.proto中的一个片段。由于这是一个新项目,我可以迁移到任何地方-如何使用proto3+可选?这是针对java的。我需要更新的protoc gen java吗?当前正在使用:protoc-gen-openapiv2-v2.0.0-beta.5-windows-x86\u 64.exe查找
——实验性的\u允许\u proto3\u可选的
-正是这个标志(相对较新)在proto3中启用状态跟踪。否则:如果值为零,则不发送该值;它不是零:它被发送。然后,您只需通过he状态依次检查每个字段API@MarcGravell,您的评论很有用,即用于测试“否/已发送”-谢谢。我的问题要宽泛一点——即一个实用程序类,它通常(1)区分基于p3发送的字段可选(2)确定是否有任何字段需要更新,即字段值不同(3)用合并/更新的字段包装一个新对象。然后客户端代码调用repo.save(updatedObj)。也许有一种通用的方法可以做到这一点。Hi@MarcGravel,看起来p3_可选特性正在影响json的反序列化。有什么解决办法吗。