Java 如何从方法中将依赖于上下文的变量提取到类中以避免重复代码?

Java 如何从方法中将依赖于上下文的变量提取到类中以避免重复代码?,java,spring,spring-boot,validation,refactoring,Java,Spring,Spring Boot,Validation,Refactoring,我有两节课 主类是GraphQL查询解析器: @Component @AllArgsConstructor class UserProfileQuery implements GraphQLQueryResolver { private final UserProfileRepository userProfileRepository; private final AddressRepository addressRepository; private final Us

我有两节课

主类是GraphQL查询解析器:

@Component
@AllArgsConstructor
class UserProfileQuery implements GraphQLQueryResolver {

    private final UserProfileRepository userProfileRepository;
    private final AddressRepository addressRepository;
    private final UserRepository userRepository;
    private final UserProfileAccessValidator validator;

    @PreAuthorize("hasAuthority('ACCOUNT_OWNER')")
    public Optional<List<UserProfile>> getUserProfiles(Long accountId) {
        User user = userRepository.findById(LoggedUserHolder.getUserId()).orElseThrow(() -> new NotFoundException(User.class));
        validator.validateAccountOwnerAccess(user, accountId);
        return userProfileRepository.findMatchingAccountId(accountId);
    }

    @PreAuthorize("hasAuthority('ACCOUNT_OWNER')")
    public Optional<UserProfile> getUserProfile(Long userProfileId) {
        User user = userRepository.findById(LoggedUserHolder.getUserId()).orElseThrow(() -> new NotFoundException(User.class));
        User checkedUser = userRepository.findByUserProfileId(userProfileId).orElseThrow(() -> new NotFoundException(User.class));
        validator.validateAccountOwnerAccess(user, checkedUser);
        return userProfileRepository.findById(userProfileId);
    }

    @PreAuthorize("hasAnyAuthority('ACCOUNT_OWNER','USER')")
    public Set<Address> getAddresses(Long userProfileId) {
        User user = userRepository.findById(LoggedUserHolder.getUserId()).orElseThrow(() -> new NotFoundException(User.class));
        User checkedUser = userRepository.findByUserProfileId(userProfileId).orElseThrow(() -> new NotFoundException(User.class));
        validator.validateAccountOwnerAndUserAccess(user, checkedUser);
        return Optional.of(addressRepository.findByUserProfileId(userProfileId)).orElseThrow(() -> new NotFoundException(UserProfile.class));
    }

}
正如您所看到的,用户抓取过程中存在大量代码重复

    User user = userRepository.findById(LoggedUserHolder.getUserId()).orElseThrow(() -> new NotFoundException(User.class));
    User checkedUser = userRepository.findById(command.getUserId()).orElseThrow(() -> new NotFoundException(User.class));
如何重构这两个类以避免代码重复?或者至少是为了避免重复:

    User user = userRepository.findById(LoggedUserHolder.getUserId()).orElseThrow(() -> new NotFoundException(User.class));

因为它正在从Spring上下文持有者中获取用户。我一个小时以来一直在讨论这个问题,我没有很好的解决方案来实现…

如果登录用户是负责人,您可以使用@PreAuthorize表达式。如果这对您有效,那么您可以使用元注释。使用元注释可以减少代码量。下面是一个关于如何使用它们的很好的教程:

您应该将这两个公共代码移动到一个实用程序类(比如UserUtility),将该类声明为@Component,创建对用户执行所需操作的方法,然后在两个类中自动连接并使用它来获得公共结果


希望这能有所帮助。

是的,但我仍然需要深入数据库获取验证器检查所需的数据,因为仅仅作为帐户所有者或用户还不足以使检查生效:(一个选项是将您从DB查找的信息添加到主体中,那么DB查找不是必需的。这可以通过实现您自己的UserDetails和UserDetailsService来完成。
    User user = userRepository.findById(LoggedUserHolder.getUserId()).orElseThrow(() -> new NotFoundException(User.class));