java—当使用rxjava3adapter返回rxjava单变量时,无法在webflux控制器中检索主体你能解释一下是什么打破了React堆的链条吗?

esbemjvw  于 2021-07-13  发布在  Java
关注(0)|答案(0)|浏览(251)

我的webflux控制器:

import reactor.adapter.rxjava.RxJava3Adapter;
import reactor.core.publisher.Mono;
import io.reactivex.rxjava3.core.Single;

@RestController
@RequestMapping("/test")
public class MyController {

  @GetMapping("/mono")
  public Mono<String> getMono(ServerWebExchange exchange) {
    return exchange.getPrincipal()
      .map(principal -> principal.getName())
      .switchIfEmpty(Mono.just("no principal"));
  }

  @GetMapping("/single")
  public Single<String> getSingle(ServerWebExchange exchange) {
    return RxJava3Adapter.monoToSingle(exchange.getPrincipal()
      .map(principal -> principal.getName())
      .switchIfEmpty(Mono.just("no principal")));
  }

}

在上述代码中, getMono 返回主体的名称,同时 getSingle 返回“无本金”。
我在想为什么。这可能与 RxJava3Adapter . 我不确定这是否会把React堆变成一个“热门”,因为我觉得这是一个竞赛条件。
我应该提到,在集成测试中,它们都可以工作,但只有在启动netty服务器并点击 getSingle 具有 curl 命令它不能返回主体。 getMono 用同样的方法也可以 curl 命令。
curl命令(失败)

curl --request GET \
--url http://localhost:8080/test/single \
--header 'authorization: Bearer XXXX' \

这是我的集成测试(通过了)

@WithMockUser
@ExtendWith(SpringExtension.class)
@SpringBootTest(webEnvironment = WebEnvironment.MOCK)
@AutoConfigureWebTestClient
public class IntegrationTest {

  @Autowired
  private WebTestClient webClient;

  @Test
  void testPrincipal() {
    final EntityExchangeResult<byte[]> getResult =
        webClient
            .get()
            .uri("/test/single")
            .exchange()
            .expectStatus()
            .isOk()
            .expectBody()
            .returnResult();

    final String response = new String(getResult.getResponseBody());
    assertNotEquals(response, "no principal");
  }

简单的解决方案是将我们所有的api转换为reactor类型,但这并不是一项简单的任务。rxjava类型在我们的代码中无处不在,而不仅仅是在控制器上。我们得重写几百个文件。所以我想在提议走这条路之前更好地理解这一点。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题