在地图内调用回购操作时,爪哇反应性悬挂
我是这个反应性世界的新手,当我想将用户映射到另一个用户时遇到问题。
因此,该代码应该转到数据库以基于用户名找到用户,然后需要创建另一个用户对象并通过调用另一个存储库来填充其权威。
然后我需要该值,因此我使用了块。
Mono<User> userMono = userService.findByUsername(regularUser.getUsername())
.map(u -> {
User user = new User();
user.setUsername(u.getUsername());
user.setAuthority(userService.getAuthorities(u));
return user;
});
User usr = userMono.block();
我发现每次代码执行块时,它都会停止工作。 DB的请求永远不会完成。我进行了调试,发现在 mono#block
- blockingsinglesubscriber#blockingget
getCount()
是1,它将转到等待(等待( )
。这永远需要。我等了,但是 getCount()
没有达到0,并且没有 intruptedException
抛出。
blockingget
UserService.java
@Autowired
UserRepository userRepository;
@Autowired
AuthorityRepository authorityRepository;
public Mono<User> findByUsername(String username) {
return userRepository.findByUsername(username);
}
public Flux<Authority> getAuthorities(User user) {
return authorityRepository.findAllByUserId(user.getId());
}
我正在使用Spring Boot 2.7.0
io.spring。依赖性管理1.0.11.Release
弹簧启动启动器 - Webflux
Spring-boot-starter-data-mongodb反应性
在地图中调用存储库的问题,
@Bean
public PasswordEncoder passwordEncoder() {
return PasswordEncoderFactories.createDelegatingPasswordEncoder();
}
@Bean
public ReactiveAuthenticationManager reactiveAuthenticationManager(ReactiveUserDetailsService userDetailsService,
PasswordEncoder passwordEncoder) {
var authenticationManager = new UserDetailsRepositoryReactiveAuthenticationManager(userDetailsService);
authenticationManager.setPasswordEncoder(passwordEncoder);
return authenticationManager;
}
@Bean
public ReactiveUserDetailsService userDetailsService(UserService userService) {
return username -> userService.findByUsername(username)
.log()
.map(u -> org.springframework.security.core.userdetails.User
.withUsername(u.getUsername()).password(u.getPassword()) .roles(userService.getRoles(u).toArray(String[]::new))
.accountExpired(!u.isActive())
.credentialsExpired(!u.isActive())
.disabled(!u.isActive())
.accountLocked(!u.isActive())
.build()
);
}
反应性用户detailservice bean,如果我硬编码角色(不去数据库),则
它效果很好。我创建了一个简单的项目来复制问题: 第57行。被称为它永远等待。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论