【问题随记】在使用 AuthenticationManager 的时候,出现循环依赖问题 —— `java.lang.StackOverflowError`

问题随记

在使用 AuthenticationManager 的时候,出现循环依赖问题 ------ java.lang.StackOverflowError,查资料查了两天半,终于找到原因。

java 复制代码
2024-06-16T17:54:19.487+08:00 ERROR 20672 --- [nio-8789-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Handler dispatch failed: java.lang.StackOverflowError] with root cause

java.lang.StackOverflowError: null
	at java.base/java.lang.ref.Reference.refersToImpl(Reference.java:375) ~[na:na]
	at java.base/java.lang.ref.Reference.refersTo(Reference.java:366) ~[na:na]
	at java.base/java.lang.reflect.AccessibleObject.isAccessChecked(AccessibleObject.java:664) ~[na:na]
	at java.base/java.lang.reflect.AccessibleObject.verifyAccess(AccessibleObject.java:695) ~[na:na]
	at java.base/java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:673) ~[na:na]
	at java.base/java.lang.reflect.Method.invoke(Method.java:560) ~[na:na]
	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) ~[spring-aop-6.0.4.jar:6.0.4]
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:211) ~[spring-aop-6.0.4.jar:6.0.4]
	at jdk.proxy2/jdk.proxy2.$Proxy74.authenticate(Unknown Source) ~[na:na]
	at jdk.internal.reflect.GeneratedMethodAccessor5.invoke(Unknown Source) ~[na:na]
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
	at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) ~[spring-aop-6.0.4.jar:6.0.4]
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:211) ~[spring-aop-6.0.4.jar:6.0.4]
	at jdk.proxy2/jdk.proxy2.$Proxy74.authenticate(Unknown Source) ~[na:na]
	at jdk.internal.reflect.GeneratedMethodAccessor5.invoke(Unknown Source) ~[na:na]
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
	at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) ~[spring-aop-6.0.4.jar:6.0.4]
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:211) ~[spring-aop-6.0.4.jar:6.0.4]
	at jdk.proxy2/jdk.proxy2.$Proxy74.authenticate(Unknown Source) ~[na:na]
	......

问题解决

在查找很多资料以及再次复现代码后,终于找到问题,问题出在自己实现的 MyUserDetailsServiceImpl 没有继承 UserDetailsService,才导致该问题。

让 MyUserDetailsServiceImpl 使用 UserDetailsService 该接口或者让 MyUserDetailsServiceImpl 使用的 MyUserDetailsService 继承 UserDetailsService 接口即可

java 复制代码
// 方法 1
@Service
public class MyUserDetailsServiceImpl implements MyUserDetailsService, UserDetailsService {


    @Autowired
    private UserService userService;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        UserEntity user = userService.findByUsername(username);
        if (user == null) {
            throw new UsernameNotFoundException("User not found");
        }
        return new SecurityUser(user);
    }
}

// 方法 2
public interface MyUserDetailsService extends UserDetailsService {
    UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;
}

出现该问题的原因可能不止这一个,比如使用两种登录机制出现该问题就要使用 @Lazy 来解决该问题

相关推荐
Xiaokai丶20 分钟前
Java 8 新特性深度剖析:核心要点与代码实战
java
灵魂猎手23 分钟前
3. MyBatis Executor:SQL 执行的核心引擎
java·后端·源码
Galaxy在掘金23 分钟前
从业8年,谈谈我认知的后端架构之路-1
java·架构
努力努力再努力wz1 小时前
【c++深入系列】:万字详解模版(下)
java·c++·redis
林开落L1 小时前
库的制作与原理
linux·开发语言·动静态库·库的制作
m0_480502641 小时前
Rust 入门 泛型和特征-特征对象 (十四)
开发语言·后端·rust
还是大剑师兰特2 小时前
Flink面试题及详细答案100道(1-20)- 基础概念与架构
大数据·flink·大剑师·flink面试题
瓦特what?2 小时前
关于C++的#include的超超超详细讲解
java·开发语言·数据结构·c++·算法·信息可视化·数据挖掘
祁同伟.2 小时前
【C++】动态内存管理
开发语言·c++
是乐谷3 小时前
阿里云杭州 AI 产品法务岗位信息分享(2025 年 8 月)
java·人工智能·阿里云·面试·职场和发展·机器人·云计算