findOne()定义为
<S extends T> Optional<S> findOne(Example<S> example);。
这意味着在您的情况下,它接受a
Example<Reader>并返回
Optional<Reader>。
您将其传递给a
String,这是错误的,并且将其用作lambda return in
AuthenticationManagerBuilder.userDetailsService(),这也是错误的,因为
UserDetailsService接口函数定义为
UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;
因此,您需要返回一个
UserDetails实例,而不是实例
Optional;
UsernameNotFoundException如果与用户名不匹配,则抛出该实例以与javadoc兼容:
返回值:
完全填充的用户记录(绝不为null)
抛出:
UsernameNotFoundException-如果找不到用户或用户没有GrantedAuthority
此外,您无需使用
findOne()该示例查询。通过ID查询就足够了。
所以你可以这样写:
@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(username -> readerRepository.findById(username).orElseThrow( () -> new UsernameNotFoundException("user with username " + username + " not found"));}附带说明一下,它
getOne()很棘手,因为它依赖于延迟加载,在某些情况下可能会带来令人惊讶的意外。
JB Nizet的话很有趣。因此,我现在进行了测试。当
isAccountNonLocked()Spring
Security类访问实体(即)时,JPA会话仍然没有打开。
因此
LazyInitializationException,无论如何都抛出a (用户名正确或否):
org.hibernate.LazyInitializationException:无法初始化代理-没有会话 在org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:155) 在org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:268) 在org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:73) 在davidhxxx.example.angularsboot.model.db.User _ $$ _ jvstd90_5.isAccountNonLocked(User _ $$ _ jvstd90_5.java) 在org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider $ DefaultPreAuthenticationChecks.check(AbstractUserDetailsAuthenticationProvider.java:352) 在org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider.authenticate(AbstractUserDetailsAuthenticationProvider.java:165)



