Java Spring引导审计被称为无限审计
我有一门审计课:Java Spring引导审计被称为无限审计,java,spring-boot,Java,Spring Boot,我有一门审计课: @Component @EnableJpaAuditing public class AuditorAwareImpl implements AuditorAware<String> { private final SecurityService securityService; public AuditorAwareImpl(SecurityService securityService) { this.securityServ
@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());
}
}
@组件
@启用JPA审核
公共类AuditorAwareImpl实现AuditorAware{
私人最终担保服务;
公共审计机构WAREIMPL(安全服务安全服务){
this.securityService=securityService;
}
@凌驾
@非空
公共可选getCurrentAuditor(){
if(securityService.getAuthenticatedUser().isEmpty()){
返回可选的.empty();
}
返回可选的.of(securityService.getAuthenticatedUser().get().getMobilePhonenNumber());
}
}
并提供安全服务:
@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());
}
}
@服务
公共类安全服务{
私有最终用户存储库用户存储库;
公共安全服务(用户存储库用户存储库){
this.userRepository=userRepository;
}
公共可选getAuthenticatedUser(){
身份验证=SecurityContextHolder.getContext().getAuthentication();
if(身份验证==null | |匿名身份验证令牌的身份验证实例){
返回可选的.empty();
}
UserDetails authUser=(UserDetails)身份验证。getPrincipal();
返回userRepository.findByMobilePhoneNumber(authUser.getUsername());
}
}
当我试图更新一个实体时,这两个类被无限地调用,结果是堆栈溢出
我使用Java11和SpringBoot2.3.4.0版本
如何修复该循环递归以避免它?一种方法是在您的服务中的
@Autowired
位置添加@Lazy
注释。这是因为如果您的组件上没有@Lazy
,那么将被急切地注入bean。因此,请尝试以下方法,它应该可以正常工作:
@Component
@EnableJpaAuditing
public class AuditorAwareImpl implements AuditorAware<String> {
@Lazy
@Autowired
private final SecurityService securityService;
.....
}
@组件
@启用JPA审核
公共类AuditorAwareImpl实现AuditorAware{
@懒惰的
@自动连线
私人最终担保服务;
.....
}
我认为这是组件上的堆栈溢出,对吗?