Erro ao consumir uma api não bloqueante - Spring-boot

Olá pessoal estou consumindo uma API não bloqueante e precisava guardar o retorno desta API em um objeto, tentei usar o método block porém recebo o erro abaixo:

"block()/blockFirst()/blockLast() are blocking, which is not supported in thread reactor-http-epoll-3",

como poderia fazer para guardar o retorno da api em algum objeto?
A api esta funcionando corretamente, o problema esta em como guardar o retorno em algum objeto ou várivel para que eu possa utilizar depois.

segue o codigo que utilizei:

Mono<AuthorizationModelDto> sxx = webClientConfiguration.createWebClient()
  .post()
  .uri(uri)
  .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
  .body(null)
  .retrieve()
  .bodyToMono(AuthorizationModelDto.class);

// recuperar os valores no método reativo!				 
sxx.subscribe(response -> retornarDados(response));

private void retornarDados(AuthorizationModelDto teste) {
  System.out.println("########################################");
  System.out.println("ENTREI NO MÉTODO!"+teste.getAcessToken());
  System.out.println("ENTREI NO MÉTODO2!"+teste.getTokenType());
  System.out.println("ENTREI NO MÉTODO3!"+teste.getInstanceUrl());
  System.out.println("ENTREI NO MÉTODO4!"+teste.getIssuedAt());
  System.out.println("ENTREI NO MÉTODO5!"+teste.getSignature());
  System.out.println("ENTREI NO MÉTODO6!"+teste.getId());
  System.out.println("########################################");
}
1 curtida

Aonde vc está usando esse método block?

1 curtida

eu tinha utilizado ele assim para retornar o objeto, desta forma é lançado o erro

AuthorizationModelDto  authorizationModelDto = webClientConfiguration.createWebClient()
  .post()
  .uri(uri)
  .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
  .body(null)
  .retrieve()
   .bodyToMono(AuthorizationModelDto.class)
   .block();

Confesso que ainda não usei webflux, mas vi um exemplo que vc pode testar:

Mono<AuthorizationModelDto> authorizationModelDto = webClientConfiguration.createWebClient()
  .post()
  .uri(uri)
  .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
  .body(null)
  .exchange()
  .then(response -> response.bodyToMono(AuthorizationModelDto.class));

eu consigo ver a resposta no corpo quando eu retiro o .block, porem gostaria de carregar o retorno em algum objeto para poder trabalhar com ele, este seria o meu problema, vou tentar realizar este teste.
utilizei o subscribe criando um método sem retorno e passei para o objeto, mas na primeira chamada por ser muito rápido não é visualizado no corpo da requisição

// declarado como variavel global
AuthorizationModelDto aut2 = new AuthorizationModelDto();
public AuthorizationModelDto testeCHamada() {
	Mono<AuthorizationModelDto> autorizar = this.webClientConfiguration
				                                .createWebClient()
											    .post()
											    .uri(uri)
											    .retrieve()
				                                .bodyToMono(AuthorizationModelDto.class);

		autorizar.subscribe(a -> retornarDados(a));

}
// metodo 

public void retornarDados(AuthorizationModelDto teste) {
		
		aut2.setAcessToken(teste.getAcessToken());
		aut2.setTokenType(teste.getTokenType());
		aut2.setInstanceUrl(teste.getInstanceUrl());
		aut2.setIssuedAt(teste.getIssuedAt());
		aut2.setSignature(teste.getSignature());
		aut2.setId(teste.getId());

		System.out.println("ENTREI NO MÉTODO3!" + aut2.getAcessToken());

	}

// controler
@PostMapping("/chama")
	public ResponseEntity testarChamada(){
		
		AuthorizationModelDto teste = authorizatorionService.testeCHamada();
		
		return ResponseEntity.ok(teste);
	}

o .exchange ja esta depreciado na versão atual do webclient

1 curtida

Consegui resolver o problema da seguinte forma:
Adicionei a dependência do spring web no projeto, o erro ao usar o método .block() .
Porque estava somente com a dependência do webflux e dessa forma ele estava usando o servidor Netty, como o meu serviço não é bloqueante utilizando o servidor Tomcat foi suficiente e consigo utilizar o método block() normalmente para recuperar os valores que preciso.

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
</dependency>
1 curtida