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
相关产品推荐
相关产品推荐

