前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【问题随记】在使用 AuthenticationManager 的时候,出现循环依赖问题 —— `java.lang.StackOverflowError`

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

作者头像
繁依Fanyi
发布2024-09-23 08:21:32
730
发布2024-09-23 08:21:32
举报
文章被收录于专栏:繁依Fanyi 的专栏

问题随记

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

代码语言:javascript
复制
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 接口即可

代码语言:javascript
复制
// 方法 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 来解决该问题

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-09-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题随记
  • 问题解决
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档