Java中自定义User类Getter方法在CustomUserDetails中无法识别求助
解决自定义User类Getter方法无法识别的问题
嗨,我一眼就看出问题所在啦,这是个典型的类导入混淆问题,咱们一步步来搞定它:
核心问题分析
你在CustomUserDetails类里导入的User是Spring Security自带的org.springframework.security.core.userdetails.User,而不是你自己定义的那个带roles属性的User实体类!这就导致编译器以为你调用的是Spring的User类的方法,而Spring的User类根本没有getRoles()方法,所以才会提示未定义。
另外还有两个小细节错误也得一起修正:
getUsername()方法里,你的自定义User类没有getUsername(),应该用getEmail()代替getAuthorities()里的collection(Collectors.toList())是拼写错误,应该是collect(Collectors.toList())
具体修复步骤
1. 修正导入语句
把CustomUserDetails里的Spring User导入删掉,换成你自己的User实体类的正确包路径。假设你的自定义User类在com.ecommerce.demo.entity包下,修改后的导入应该是:
import com.ecommerce.demo.entity.User; // 替换成你实际的User类包路径 // 删掉下面这行错误的导入 // import org.springframework.security.core.userdetails.User;
2. 修正getUsername()方法
因为你的自定义User类用email作为用户名,所以把方法改成:
@Override public String getUsername() { return user.getEmail(); }
3. 修正getAuthorities()方法的拼写错误
把collection改成collect,同时注意role对象的处理(假设你的Role类有getRoleName()或者类似获取角色名称的方法,这里我用getRoleName()举例,如果你的Role类是直接存字符串的,就直接用role.toString()):
@Override public Collection<? extends GrantedAuthority> getAuthorities() { return user.getRoles().stream() .map(role -> new SimpleGrantedAuthority("ROLE_" + role.getRoleName())) // 根据你的Role类实际方法调整 .collect(Collectors.toList()); }
修复后的完整CustomUserDetails代码
package com.ecommerce.demo.services; import com.ecommerce.demo.entity.User; // 替换成你实际的User类包路径 import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.userdetails.UserDetails; import java.util.Collection; import java.util.stream.Collectors; public class CustomUserDetails implements UserDetails { private User user; /*Getter and Setters for user variable*/ public User getUser() { return user; } public void setUser(User user) { this.user = user; } /*Overrided Methods Of User Details Class*/ @Override public Collection<? extends GrantedAuthority> getAuthorities() { return user.getRoles().stream() .map(role -> new SimpleGrantedAuthority("ROLE_" + role.getRoleName())) // 根据你的Role类调整 .collect(Collectors.toList()); } @Override public String getPassword() { return user.getPassword(); } @Override public String getUsername() { return user.getEmail(); } @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类的getRoles()方法啦,另外记得确认你的Role类有正确的Getter方法来获取角色名称哦~
内容的提问来源于stack exchange,提问作者deep
相关产品推荐
相关产品推荐

