SpringBoot 3.2.2 OAuth2社交登录Role类型注入错误求助
SpringBoot 3.2.2 OAuth2社交登录Role类型不匹配问题
问题场景
在实现OAuth2社交登录时,编写CustomOAuth2UserService的loadUser方法,创建自定义CustomOAuth2User对象时,传入createdUser.getRole()出现类型不匹配错误:所需类型为javax.management.relation.Role,提供的类型为com.Next.enums.Role。但调用createdUser.getEmail()可正常执行。
相关代码
CustomOAuth2UserService.java
@Slf4j @Service @RequiredArgsConstructor public class CustomOAuth2UserService implements OAuth2UserService<OAuth2UserRequest, OAuth2User> { private final UserRepository userRepository; private static final String NAVER="naver"; private static final String KAKAO="kakao"; @Override public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException { log.info("CustomOAuth2UserService.loadUser() Run - Enter OAuth2 login request"); OAuth2UserService<OAuth2UserRequest, OAuth2User> delegate = new DefaultOAuth2UserService(); OAuth2User oAuth2User = delegate.loadUser(userRequest); String registrationId = userRequest.getClientRegistration().getRegistrationId(); SocialType socialType = getSocialType(registrationId); String userNameAttributeName = userRequest.getClientRegistration() .getProviderDetails().getUserInfoEndpoint().getUserNameAttributeName(); Map<String, Object> attributes = oAuth2User.getAttributes(); OAuthAttributes extractAttributes = OAuthAttributes.of(socialType, userNameAttributeName, attributes); User createdUser = getUser(extractAttributes, socialType); // 创建并返回实现DefaultOuth2User的自定义OAuth2User对象 return new CustomOAuth2User( Collections.singleton(new SimpleGrantedAuthority(createdUser.getRole().getKey())), attributes, extractAttributes.getNameAttributeKey(), createdUser.getEmail(), createdUser.getRole() // 错误位置 ); } }
User.java
package com.Next.domain; import com.Next.enums.SocialType; import com.Next.enums.Role; import jakarta.persistence.*; import lombok.*; import org.springframework.security.crypto.password.PasswordEncoder; @Entity @Builder @Getter @AllArgsConstructor @NoArgsConstructor(access = AccessLevel.PROTECTED) @Table(name = "USERS") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name="user_id") private Long id; private String email; private String password; private String nickname; @Enumerated(EnumType.STRING) private Role role; @Enumerated(EnumType.STRING) private SocialType socialType; // KAKAO, NAVER, GOOGLE private String socialId; // 登录社交类型的标识值 private String refreshToken;//刷新令牌 public void authorizeUser() { this.role = com.Next.enums.Role.USER; } public void passwordEncode(PasswordEncoder passwordEncoder){ this.password=passwordEncoder.encode(this.password); } public void updateRefreshToken(String updateRefreshToken){ this.refreshToken=updateRefreshToken; } }
错误原因
问题出在CustomOAuth2User类的构造函数定义上:该类的构造函数中接收Role类型参数的位置,错误导入了javax.management.relation.Role包,而非你自定义的com.Next.enums.Role枚举,导致类型不兼容。
解决方案
- 打开
CustomOAuth2User类,找到构造函数的参数列表 - 移除错误的导入语句:
import javax.management.relation.Role; - 添加正确的导入语句:
import com.Next.enums.Role; - 确保构造函数的参数类型明确为自定义的
Role枚举,重新编译代码即可解决类型不匹配问题
内容的提问来源于stack exchange,提问作者yjr
相关产品推荐
相关产品推荐

