我有一条记录,用于通过 json/Jackson 发出更新请求:
public record UpdateRequest(
Optional<String> field1,
Optional<LocalDate> field2,
Optional<@Max(24) Integer> field3,
...
Optional<String> specialField) {}
如果实体被标记为
closed
(specialField
除外),我想防止发生更新。它始终可以用于更新实体。
虽然实体是
closed
,但我想允许更新请求,例如:
{
"specialField": "newValue"
}
但是要防止这样的情况:
{
"field1": "newValue"
}
我正在努力想出一个好的解决方案来检查是否可以应用更新。这就是我所拥有的:
public boolean isUpdateValid(Entity entity, UpdateRequest updateRequest) {
return !entity.isClosed()
|| (updateRequest.field1().isEmpty()
&& updateRequest.field2().isEmpty()
&& updateRequest.field3().isEmpty());
}
但这很容易出错,因为当新字段添加到
isUpdateValid
时,没有人会更新 UpdateRequest
。有没有人有关于更好的方法来构建它的建议,以便随着 UpdateRequest
的变化更易于维护?
我想出了以下解决方案,可能有点笨拙,但应该可行。
public boolean isUpdateValid(Entity entity, UpdateRequest updateRequest) {
return !entity.isClosed() || new UpdateRequest(Optional.empty(), Optional.empty(), ..., updateRequest.specialField()).equals(updateRequest);
}
这应该可以工作,因为记录已经生成了
equals
方法,但如果您在记录中覆盖它,则不会工作。