You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中该类授权资源类结构下如何优雅实现代码复用?

方案1:调整公共校验方法返回值(最轻量实现)

你之前无法直接封装公共校验逻辑的核心问题是让checkCommon直接返回了固定的Response,只要把返回值改成Optional<Response>即可:校验通过返回空对象,校验失败返回对应错误Response,上层调用方可直接使用默认错误,也可以自定义替换返回结果。

公共校验方法实现

// 公共工具类中的通用校验逻辑
public Optional<Response> checkCommon() {
    // 非人类校验失败返回对应错误
    if (!myClass.checkIfHuman()) {
        return Optional.of(Response.status(Response.Status.FORBIDDEN)
                .entity("用户身份校验失败")
                .build());
    }
    // 角色A校验失败返回对应错误
    if (!myClass.checkRoleA()) {
        return Optional.of(Response.status(Response.Status.FORBIDDEN)
                .entity("缺少必要角色A")
                .build());
    }
    // 校验通过返回空
    return Optional.empty();
}

业务方法调用示例

基类authorize方法:

public Response authorize() {
    Optional<Response> commonCheckError = myClass.checkCommon();
    if (commonCheckError.isPresent()) {
        // 基类可直接使用默认错误,也可自定义替换
        return commonCheckError.get();
    }
    myClass.checkIfRoleBAndC();
    return Response.ok().build();
}

子类authorizeTallPerson方法:

public Response authorizeTallPerson() {
    Optional<Response> commonCheckError = myClass.checkCommon();
    if (commonCheckError.isPresent()) {
        // 子类自定义特殊错误返回
        return Response.status(Response.Status.BAD_REQUEST)
                .entity("高个子用户校验失败:" + commonCheckError.get().getEntity())
                .build();
    }
    myClass.checkIfTallPerson();
    myClass.checkIfRoleBAndC();
    return Response.ok().build();
}

方案2:责任链模式(适合后续校验逻辑持续扩展的场景)

如果后续校验步骤会持续增加,建议把每个校验逻辑封装为独立节点,上层按需组装校验链即可,完全消除重复代码:

定义统一校验接口

public interface AuthCheckStep {
    // 校验通过返回Optional.empty(),失败返回对应错误Response
    Optional<Response> doCheck();
}

每个校验逻辑实现为独立节点

// 人类身份校验节点
public class HumanCheckStep implements AuthCheckStep {
    @Override
    public Optional<Response> doCheck() {
        if (!myClass.checkIfHuman()) {
            return Optional.of(Response.status(403).entity("非人类用户").build());
        }
        return Optional.empty();
    }
}

// 角色A校验节点
public class RoleACheckStep implements AuthCheckStep {
    @Override
    public Optional<Response> doCheck() {
        if (!myClass.checkRoleA()) {
            return Optional.of(Response.status(403).entity("缺少角色A").build());
        }
        return Optional.empty();
    }
}

// 高个子校验节点
public class TallPersonCheckStep implements AuthCheckStep {
    @Override
    public Optional<Response> doCheck() {
        if (!myClass.checkIfTallPerson()) {
            return Optional.of(Response.status(403).entity("不符合身高要求").build());
        }
        return Optional.empty();
    }
}

// 角色B、C校验节点
public class RoleBCCheckStep implements AuthCheckStep {
    @Override
    public Optional<Response> doCheck() {
        if (!myClass.checkIfRoleBAndC()) {
            return Optional.of(Response.status(403).entity("缺少角色B或C").build());
        }
        return Optional.empty();
    }
}

业务方按需组装校验链

// 基类校验逻辑:组装对应校验链执行即可
public Response authorize() {
    List<AuthCheckStep> checkChain = List.of(
        new HumanCheckStep(),
        new RoleACheckStep(),
        new RoleBCCheckStep()
    );
    for (AuthCheckStep step : checkChain) {
        Optional<Response> error = step.doCheck();
        if (error.isPresent()) {
            // 可自定义返回错误
            return error.get();
        }
    }
    return Response.ok().build();
}

// 子类高个子校验逻辑:复用已有节点组装新链条
public Response authorizeTallPerson() {
    List<AuthCheckStep> checkChain = List.of(
        new HumanCheckStep(),
        new RoleACheckStep(),
        new TallPersonCheckStep(),
        new RoleBCCheckStep()
    );
    for (AuthCheckStep step : checkChain) {
        Optional<Response> error = step.doCheck();
        if (error.isPresent()) {
            // 可自定义返回错误
            return Response.status(400).entity("高个子权限校验失败:" + error.get().getEntity()).build();
        }
    }
    return Response.ok().build();
}

内容的提问来源于stack exchange,提问作者Guest User

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 06:18:05