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

Spring Boot:抽取用户权限校验方法至独立类是否推荐?求优化设计

方案建议

1. 抽取到独立类是完全推荐的方案

你的思路完全可行,把重复的角色校验、参数填充逻辑抽成独立类,能直接解决代码冗余问题,大幅提升可维护性。具体实现可以这么做:

  • 新建一个业务服务类(比如UserSearchContextHandler),将updateSearchInformation改为公共方法,通过构造注入依赖的classroomService和DataUtilService:
@Component
public class UserSearchContextHandler {
    private final ClassroomService classroomService;
    private final DataUtilService dataUtilService;

    public UserSearchContextHandler(ClassroomService classroomService, DataUtilService dataUtilService) {
        this.classroomService = classroomService;
        this.dataUtilService = dataUtilService;
    }

    public AdminUserSearchDto updateSearchInformation(CustomUserDetails userDetails, Long classroomId, Integer year) {
        if(Role.TEACHER.getValue().equals(userDetails.getRole())) {
            classroomId = classroomService.findClassroomByAdminUserId(userDetails.getId())
                    .orElseThrow(() -> new GlobalException(ExceptionMessage.TEACHER_NOT_ASSIGNED))
                    .getId();
            year = dataUtilService.getYearData();
        }
        return AdminUserSearchDto.builder()
                .classroomId(classroomId)
                .year(year)
                .build();
    }
}
  • 在需要该逻辑的服务类中,注入UserSearchContextHandler直接调用方法即可,无需重复编写逻辑。

2. 其他更有效的替代策略

自定义注解 + AOP 切面

如果该逻辑是多个服务方法执行前的参数预处理步骤,可以用AOP统一拦截:

  • 定义自定义注解(比如@FillSearchContext)
  • 编写切面类,拦截带有该注解的方法,在方法执行前完成角色校验和参数填充,将处理后的AdminUserSearchDto传入方法或存入上下文
    这种方式能进一步减少业务代码中的调用代码,让逻辑与业务方法解耦。

策略模式(适配未来角色扩展)

如果后续要新增更多角色的处理规则(比如学生、管理员的不同参数逻辑),可以用策略模式拆分:

  • 定义SearchContextStrategy接口,包含updateSearchInformation方法
  • 为每个角色实现对应的策略类(比如TeacherSearchStrategy、AdminSearchStrategy)
  • 编写策略工厂类,根据用户角色动态获取对应策略实例执行逻辑
    这种方式能让不同角色的逻辑解耦,后续扩展新角色时无需修改原有代码,符合开闭原则。

DTO静态构建方法(仅适用于无外部依赖的场景)

如果逻辑相对简单且无外部服务依赖,也可以把逻辑封装到AdminUserSearchDto的静态构建方法中,但要注意这种方式会让DTO依赖业务逻辑,违反单一职责,仅适合简单场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 17:36:19