登录 NullPointerException 时 Spring Security 无法访问 userService
Posted
技术标签:
【中文标题】登录 NullPointerException 时 Spring Security 无法访问 userService【英文标题】:Spring security cannot access userService while login NullPointerException 【发布时间】:2021-06-06 20:24:39 【问题描述】:当发出登录请求时,出现此错误,告诉我 userService 为空。 当我创建 UserService 的对象而不是自动装配它时,它会传递它,但告诉我在 userService 中调用的存储库为空。存储库是自动装配的,我无法实例化它,因为它是一个接口。
这里是服务类:
@Service
public class MyUserDetailsService implements UserDetailsService
@Autowired
UserService userService;
@Override
public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException
return new MyUserDetails(userService.getByUsernameOrEmail(s));
这是安全配置类: 另外我正在创建一个 MyUserService 对象,因为 spring 无法自动装配它告诉我没有 bean 有这样的名称。
@Configuration
@EnableWebSecurity
public class UserSercurity extends WebSecurityConfigurerAdapter
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception
auth.userDetailsService(new MyUserDetailsService());
@Override
protected void configure(HttpSecurity http) throws Exception
http.csrf().disable().authorizeRequests()
.anyRequest().hasRole(UserType.ADMIN.toString())
.and().formLogin();
@Bean
public PasswordEncoder passwordEncoder()
return NoOpPasswordEncoder.getInstance();
【问题讨论】:
【参考方案1】:您不能在存储库中实例化方法或变量,因为它是一个接口,但是您可以自动装配存储库类以使用在 userRepository 接口中声明的方法,您必须自动装配存储库类。您可以像我一样这样做在下面的代码中完成。 你的服务类应该是这样的:
@Autowired
private UserRepository userRepository;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException
Users user = userRepository.getUserByUsername(username);
if (user == null)
throw new UsernameNotFoundException("Could not find user");
return new MyUserDetails(user);
你的仓库应该是这样的:
@Repository
public interface UserRepository extends JpaRepository<Users, Long>
@Query("SELECT u FROM Users u WHERE u.name = ?1")
public Users getUserByUsername(String username);
并且还在您的配置类中自动装配 UserDetailsService 并在您的 configure(AuthenticationManagerBuilder auth) 方法中传递实例 userDetailsService,UserDetailsService 为您提供 MyUserDetailService 类的实例。
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter
@Autowired
UserDetailsService userDetailsService;
@Bean
public PasswordEncoder getPasswordEncoder()
return NoOpPasswordEncoder.getInstance();
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception
auth.userDetailsService(userDetailsService);
@Override
protected void configure(HttpSecurity http) throws Exception
http.authorizeRequests()
.antMatchers("/").permitAll()
.and()
.formLogin().permitAll()
.defaultSuccessUrl("/", true)
.and()
.logout().permitAll()
.logoutSuccessUrl("/");
尝试以这种方式实施,如果这是您问题的解决方案,请告诉我,如果您仍有疑问,请随时提问。
【讨论】:
Intellij 强调 userDetailsService 告诉我无法自动注册,没有找到 UserDetailsService 的 bean,但应用程序可以编译并且可以运行,谢谢以上是关于登录 NullPointerException 时 Spring Security 无法访问 userService的主要内容,如果未能解决你的问题,请参考以下文章
Facebook 登录 AsyncTask #4 NullPointerException 启动时崩溃
Android java.lang.NullPointerException:println需要一条消息[重复]
使用 Facebook SDK 和 ParseFacebookUtils 登录时出现 NullPointerException
StandardPasswordEncoder 抛出 NullPointerException : SpringSecurity