【发布时间】:2020-08-27 05:54:40
【问题描述】:
我对 reactor 还很陌生,我已经被以下代码卡住了太多时间,这些代码对我不起作用,我不知道下一步该做什么。
我已将我的代码简化如下:
@RestController
public class HelloController {
@Autowired
@Qualifier("currentUserService")
private CurrentUserContextService userContextService;
@GetMapping("/v1/hello2")
public Mono<PulseUser> getHello2() {
final Mono<PulseUser> currentUser2 = Mono
.just(new PulseUser("login", "pasdsword", Collections.emptyList(), 65));
currentUser2.subscribe(user -> {
System.out.println("+++++++++" + user);
});
userContextService.getCurrentUser().subscribe(user -> {
System.out.println("*************" + user);
});
return userContextService.getCurrentUser();
}
}
像这样使用 userContextService:
@Service("currentUserService")
public class CurrentUserContextServiceImpl implements CurrentUserContextService {
@Override
public Mono<PulseUser> getCurrentUser() {
final Mono<SecurityContext> context = ReactiveSecurityContextHolder.getContext();
return context.map(security -> {
final PulseUser details = (PulseUser) security.getAuthentication().getDetails();
return details;
});
}
}
有了这个,代码,我得到了什么:
- 如果我点击 /v1/hello2,我会收到当前用户的 json 响应:OK
- 我还获得了第一个 Sysout,带有“+++”分隔符的那个:好的
- 但我没有得到第二个,带有“****”分隔符的那个:KO
我是这样诊断的:
- 我收到 json 响应,证明 getCurrentUser() 确实有效。
- 我得到了第一个 sysout,证明订阅代码确实有效
- 我没有得到我绝对无法理解的第二个系统输出。
显然,我对第二个 sysout 感兴趣,因为它看起来像是我想要开始工作的代码,即:
调用myMethod(PulseUser myUser),其中myUser 来自userContextService.getCurrentUser()。
稍微清楚一点:
public void touch(MyData data) {
//use the mono value of userContextService.getCurrentUser()
//and call a method on data using the current PulseUser of the Mono
}
有人可以帮帮我吗?
【问题讨论】:
标签: java spring-boot reactive-programming project-reactor