You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 12:43:14