首页 > 解决方案 > Spring Boot 审计被无限调用

问题描述

我有一个审计课:

@Component
@EnableJpaAuditing
public class AuditorAwareImpl implements AuditorAware<String> {

    private final SecurityService securityService;

    public AuditorAwareImpl(SecurityService securityService) {
        this.securityService = securityService;
    }

    @Override
    @NonNull
    public Optional<String> getCurrentAuditor() {
        if (securityService.getAuthenticatedUser().isEmpty()) {
            return Optional.empty();
        }

        return Optional.of(securityService.getAuthenticatedUser().get().getMobilePhoneNumber());
    }
}

并有安全服务:

@Service
public class SecurityService {

    private final UserRepository userRepository;

    public SecurityService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public Optional<User> getAuthenticatedUser() {
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        if (authentication == null || authentication instanceof AnonymousAuthenticationToken) {
            return Optional.empty();
        }

        UserDetails authUser = (UserDetails) authentication.getPrincipal();
        return userRepository.findByMobilePhoneNumber(authUser.getUsername());
    }

}

当我尝试更新实体时,这两个类被无限调用,导致堆栈溢出。

我使用 Java 11 和 Spring Boot 2.3.4.RELEASE。

我怎样才能修复这种递归递归以避免它?

标签: javaspring-boot

解决方案


一种方法是@Lazy在服务所在的位置对其进行注释@Autowired。这是因为如果您@Lazy的组件上没有注释,则将急切地将其注入到 bean 中。因此,请尝试以下操作,它应该可以正常工作:

@Component
@EnableJpaAuditing
public class AuditorAwareImpl implements AuditorAware<String> {

    @Lazy
    @Autowired
    private final SecurityService securityService;
   
    .....
}

推荐阅读