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
相关产品推荐
相关产品推荐

