让我们假装RESTful服务收到PATCH
请求,以更新可能包含数十个字段的实体的一个或多个字段。
@Entity
public class SomeEntity {
@Id
@GeneratedValue
private Long id;
// many other fields
}
修补相应实体的一种肮脏方式是编写如下内容:
SomeEntity patch = deserialize(json);
SomeEntity existing = findById(patch.getId());
if (existing != null)
{
if (patch.getField1() != null)
{
existing.setField1(patch.getField1());
}
if (patch.getField2() != null)
{
existing.setField2(patch.getField2());
}
if (patch.getField3() != null)
{
existing.setField3(patch.getField3());
}
}
但这太疯狂了!如果我想补丁1到很多&该实体的其他协会疯狂甚至可能变得危险!
是否有一种理智的方式来完成这项任务?
答案 0 :(得分:0)
修改SomeEntity的getter并应用check,如果有任何值为空或null,则只返回相应的实体对象值。
class SomeEntity {
transient SomeEntity existing;
private String name;
public String getName(){
if((name!=null&&name.length()>0)||existing==null){
return name;
}
return existing.getName();
}
}
答案 1 :(得分:0)
您可以发送一个数组,其中包含您要修补的字段的名称。然后,在服务器端,通过反射或任何字段映射,将每个字段设置为实体。我已经实现了它并且它有效,我认为最好的建议是:
不要发布端点来执行"泛型" PATCH(修改),但是执行特定操作的。例如,如果要修改员工的地址,请发布端点,如:
PUT /employees/3/move
需要使用新地址{"address" : "new address"}
的JSON。
答案 2 :(得分:0)
不是通过自己编写逻辑来重新发明轮子,为什么不使用像Dozer这样的映射库?你想使用' map-null'映射属性:http://dozer.sourceforge.net/documentation/exclude.html
编辑我不确定是否可以将类映射到自身。但是,你可以使用中间人DTO。