在HTTP / api上下文中执行方法之前设置字段的正确方法和位置

我正在一个项目中实施制造商检查程序原则;基本上是在何处创建(由http POST触发到/api/someEntity),更新(可以由PUTPATCH触发到/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}}属性到达服务层方法之前对其进行设置。

我可以想到两种方法:

  1. 自定义解串器(即甚至在控制器层之前编辑对象):示例实现为:
User
  1. 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上下文中,并且存在对相关端点的请求。

问题是:您认为上述哪种方法是处理这种情况的更好方法?您能想到一个更好的解决方案吗?

tan243991552 回答:在HTTP / api上下文中执行方法之前设置字段的正确方法和位置

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/2953118.html

大家都在问