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

Lombok注解生效异常:getRoles()等方法找不到问题求助

问题排查与修复方案

1. 核心编译错误:User类导入混淆

编译错误提示variable user of type org.springframework.security.core.userdetails.User,说明你的CustomUserDetail构造函数参数User导入的是Spring Security自带的User类,而非你自己定义的User实体。

修复:
在CustomUserDetail类顶部,将导入的org.springframework.security.core.userdetails.User替换为你项目中自定义的User实体类的包路径,比如:

// 替换成你自己的User实体包路径
import com.yourpackage.entity.User;

2. Lombok Getter方法命名不符合调用

你的Role类字段是role_name,Lombok会遵循Java驼峰命名规则生成getRoleName()方法,而非getRole_name()。代码中role.getRole_name()的写法不符合Lombok生成的方法名,导致标红报错。

修复:
将role.getRole_name()改为role.getRoleName():

this.roles = user.getRoles().stream()
    .map(role -> new SimpleGrantedAuthority(role.getRoleName()))
    .collect(Collectors.toList());

3. CustomUserDetail重写方法未正确实现

当前CustomUserDetail中重写的UserDetails方法都返回null或false,这会导致认证逻辑失效,需要修正:

@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
    return this.roles; // 返回角色权限集合
}

@Override
public String getPassword() {
    return this.password; // 返回用户密码
}

@Override
public String getUsername() {
    return this.name; // 返回用户名
}

@Override
public boolean isAccountNonExpired() {
    return true; // 账号未过期
}

@Override
public boolean isAccountNonLocked() {
    return true; // 账号未锁定
}

@Override
public boolean isCredentialsNonExpired() {
    return true; // 凭证未过期
}

@Override
public boolean isEnabled() {
    return true; // 账号已启用
}

额外检查:User实体字段错误

你的User实体中@Column(name = "role_id")标注在id字段上,这明显错误,应该改为对应数据库中用户ID的字段名,比如user_id:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "user_id") // 修正为用户ID的列名
private Long id;

内容的提问来源于stack exchange,提问作者program

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 10:45:47