我的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类型在我们的代码中无处不在,而不仅仅是在控制器上。我们得重写几百个文件。所以我想在提议走这条路之前更好地理解这一点。
暂无答案!
目前还没有任何答案,快来回答吧!