java - 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。
我怎样才能修复这种递归递归以避免它?
解决方案
一种方法是@Lazy
在服务所在的位置对其进行注释@Autowired
。这是因为如果您@Lazy
的组件上没有注释,则将急切地将其注入到 bean 中。因此,请尝试以下操作,它应该可以正常工作:
@Component
@EnableJpaAuditing
public class AuditorAwareImpl implements AuditorAware<String> {
@Lazy
@Autowired
private final SecurityService securityService;
.....
}
推荐阅读
- python - 熊猫根据条件删除行
- android - 如何在值文件夹下的 Android Studio 中创建一个名为“dimens”的文件夹?
- node.js - 错误:在 TCPConnectWrap.afterConnect 处连接 ETIMEDOUT [as oncomplete]
- vba - 使用 VBA 和右对齐在 Word Doc 中创建页脚
- python - 使用 Python 脚本时 Xcode lldb 调试器中的空 lldb.frame 变量
- asp.net - Asp.net mvc - 将默认路由更改为 http://myparameter.localhost:5000/controller/action/id
- twilio - 有没有办法访问从 Twilio 的 VoiceResponse 说出的实际音频?
- google-translate - 防止特定文本(例如命名实体)被任何语言翻译器(如谷歌翻译器等)翻译的最佳方法是什么?
- javascript - 如何使用 for 循环为数组中的每个书 ID 生成一个带有 li 元素的函数(或多个函数)?
- javascript - 可通过 http.get 观察