我正在一个项目中实施制造商检查程序原则;基本上是在何处创建(由http POST
触发到/api/someEntity
),更新(可以由PUT
或PATCH
触发到/api/someEntity/id
或删除操作(由DELETE
至/api/someEntity/id
必须由系统的其他用户批准才能生效。
现在,一切都准备就绪,我正在寻找一种实现选择性批准的方法,基本上不必批准所有内容,而只需批准重要的内容(例如,如果禁用了残障的实体,那就放开它,但是如果一个活动的实体用户的电子邮件正在更改,需要批准)。
我有一个叫MakerChecker
的班级:
public interface MakerChecker {
boolean needsApproval();
}
和实现它的示例实体将是User
类:
public class User implements MakerChecker {
@JsonIgnore private boolean needsApproval = false;
private boolean enabled;
private String email;
}
在我的服务层中,我想这样做:
public SomeReturn someUpdateMethod(User user) {
if(user.needsApproval()) {
// Create approval request and return
}
// Update user and return
}
基本上,我需要在needsApproval
的{{1}}属性到达服务层方法之前对其进行设置。
我可以想到两种方法:
- 自定义解串器(即甚至在控制器层之前编辑对象):示例实现为:
User
- AspectJ:我可以使用AspectJ拦截服务层方法:
public class UserDeserializer extends JsonDeserializer<User> {
@Override
public User deserialize(JsonParser parser,DeserializationContext context) throws IOException {
User user = ...
HttpServletRequest request =
((ServletRequestAttributes)RequestContextHolder.getRequestAttributes())
.getRequest();
if(HttpMethod.POST.matches(request.getMethod())){
// Logic for setting `needsApproval` upon creation
}
if(HttpMethod.PUT.matches(request.getMethod()) ||
HttpMethod.PATCH.matches(request.getMethod())){
// Logic for setting `needsApproval` upon update/patch
}
return user;
}
}
尽管上面的两个地方似乎在不同的上下文中处理问题,但我认为存在争议的服务层仅在我的api中服务。因此,它们都在web / http上下文中,并且存在对相关端点的请求。
问题是:您认为上述哪种方法是处理这种情况的更好方法?您能想到一个更好的解决方案吗?