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

Spring Boot中实现UserDetails的User实体字段无法访问问题

问题原因分析

你遇到的问题是因为手动编写的getter/setter方法与Lombok注解冲突,导致@Builder无法正确生成name、email这类自定义字段的构建方法。

@Data注解已经会自动为所有字段生成标准的getter、setter、equals、hashCode和toString方法,而你手动编写了这些方法,打乱了Lombok的代码生成逻辑,使得@Builder仅识别到了UserDetails接口相关方法对应的字段。

解决方案

1. 删除所有手动编写的getter和setter方法

保留@Data注解即可,它会自动生成所有字段的getter/setter,避免和Lombok生成的代码冲突。修改后的User类核心代码如下:

@Table(name = "user_table")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
public class User implements UserDetails {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    @Column(name = "user_id")
    private Long userId;
    private String name;
    private String email;
    private String password;

    @Enumerated(EnumType.STRING)
    private Role role;

    @ManyToMany
    @JoinTable(
        name = "user_course",
        joinColumns = @JoinColumn(name = "user_id"),
        inverseJoinColumns = @JoinColumn(name = "course_id")
    )
    private List<Course> courses;

    // 仅保留UserDetails接口的重写方法
    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return List.of(new SimpleGrantedAuthority(role.name()));
    }

    @Override
    public String getUsername() {
        return email;
    }

    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    @Override
    public boolean isEnabled() {
        return true;
    }
}

2. 验证Builder功能

修改后,User.builder()就能正常访问所有自定义字段的构建方法:

public AuthenticationResponse register(RegisterRequest request) {
    var user = User.builder()
        .name(request.getName())
        .email(request.getEmail())
        .password(passwordEncoder.encode(request.getPassword())) // 务必加密密码
        .role(request.getRole())
        .build(); // 调用build()生成实例
    
    userRepository.save(user);
    // 后续JWT生成等逻辑
}

额外注意事项

  • 密码必须通过PasswordEncoder加密后再存入数据库,这是Spring Security的强制规范。
  • 确保项目已正确引入Lombok依赖,Maven依赖示例:
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>

内容的提问来源于stack exchange,提问作者Click me Plzzz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 06:47:37