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