Consumindo Api Rest via Springboot (WebClient)

Ola amigos,

Estou desenvolvendo um aplicação em spring boot que deve consumir um API rest que ja está em funcionamento no servidor

Porem esta retornando um erro, alguem poderia me ajudar?

@SpringBootApplication
@ComponentScan
public class JiraApplication {

@Bean
public WebClient webClient(WebClient.Builder builder) {
	return builder
	.baseUrl("https://issues.cpqd.com.br/rest/atm/1.0/testcase/LABPOS-T364")
	.defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
	.build();
	
}


public static void main(String[] args) {
	SpringApplication.run(JiraApplication.class, args);
	
	
}

}

Meu controller

@RestController
public class RequisicoesController {

@Autowired
private RequisicoesControllerService requisicoesControllerService;

@GetMapping("/requisicoes")
public ResponseEntity<RequisicaoDetalhes> obterRequisicaoDetalhes(@PathVariable Long numeroRequisicao){
	
	RequisicaoDetalhes requisicaoDetalhes = this.requisicoesControllerService.obterRequisicaoDetalhes(numeroRequisicao);
	
	return ResponseEntity.ok(requisicaoDetalhes);
}

}

model

package br.com.cpqd.jira.model;

public class RequisicaoDetalhes {

private Long numeroRequisicao;
private String nomeRequisicao;
private String precondition;
private String objective;
private String expectedResult;
private String description;

public Long getNumeroRequisicao() {
	return numeroRequisicao;
}
public void setNumeroRequisicao(Long numeroRequisicao) {
	this.numeroRequisicao = numeroRequisicao;
}
public String getNomeRequisicao() {
	return nomeRequisicao;
}
public void setNomeRequisicao(String nomeRequisicao) {
	this.nomeRequisicao = nomeRequisicao;
}
public String getPrecondition() {
	return precondition;
}
public void setPrecondition(String precondition) {
	this.precondition = precondition;
}
public String getObjective() {
	return objective;
}
public void setObjective(String objective) {
	this.objective = objective;
}
public String getExpectedResult() {
	return expectedResult;
}
public void setExpectedResult(String expectedResult) {
	this.expectedResult = expectedResult;
}
public String getDescription() {
	return description;
}
public void setDescription(String description) {
	this.description = description;
}

}

SERVICE

@Service
public class RequisicoesControllerService {

@Autowired
private WebClient webClient;


public RequisicaoDetalhes obterRequisicaoDetalhes(Long numeroRequisicao) {
	
	

	Mono<RequisicaoDetalhes> monoRequisicao = this.webClient
	.method(HttpMethod.GET)
	.uri("/requisicoes", numeroRequisicao)
	.retrieve()
	.bodyToMono(RequisicaoDetalhes.class);
	
	
	

	monoRequisicao.subscribe(p ->{
		System.out.println("Aqui sim, finalizou mesmo");
	});

	System.out.println("finalizou..");

	RequisicaoDetalhes detalhes = monoRequisicao.block();
	

	return detalhes;
}

}

E o erro que está vindo e este :

Description:

Field requisicoesControllerService in br.com.cpqd.jira.controller.RequisicoesController required a bean of type ‘br.com.jira.service.RequisicoesControllerService’ that could not be found.

The injection point has the following annotations:
- @org.springframework.beans.factory.annotation.Autowired(required=true)

Action:

Consider defining a bean of type ‘br.com.jira.service.RequisicoesControllerService’ in your configuration.

Alguem poderia me ajudar?

Boa tarde.
Provavelmente é porque você critou o método “webClient()” na classe principal do programa.

Eu criaria um pacote “br.com.jira.util”, e uma classe “Util”.
Dai criaria esse método “webClient()” dentro dessa classe Util.

Assim o spring não vai reclamar de bean.

Exemplo de como ficaria a classe…

package br.com.jira.util;

import org.springframework.context.annotation.Bean;

public class Util {

	@Bean
	public void webClient(String builder) {
		return builder
				.baseUrl("https://issues.cpqd.com.br/rest/atm/1.0/testcase/LABPOS-T364")
				.defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
				.build();
	}
	
}

Bom dia amigo

muito obrigado pela resposta!

Realmente eu não tinha pensado nisto, vou tenta fazer desta maneira que você me ajudou e te dou um retorno

Pior que mesmo fazendo a alteração da maneira que você me informou, criando a classe util e colocando la o webClient, quando vou executa-la o mesmo erro persiste.

não sei o que seria a causa deste erro, se e alguma injeção de classe que precisa ser feita ou algo do tipo rs

O Erro:

Description:

Field requisicoesControllerService in br.com.cpqd.jira.controller.RequisicoesController required a bean of type ‘br.com.jira.service.RequisicoesControllerService’ that could not be found.

The injection point has the following annotations:
- @org.springframework.beans.factory.annotation.Autowired(required=true)

Action:

Consider defining a bean of type ‘br.com.jira.service.RequisicoesControllerService’ in your configuration.

Adiciona a tag @Component ao seu controller e ao service.

@ComponentScan(basePackageClasses = {RequisicoesControllerService.class})

coloquei e funcionou

quando eu executo no chrome para obter retorno
vem o erro 404 rs

mas este erro de cima consegui resolver

@BrasileiroMatheus e amigos, tudo bem? Estou criando um código semelhante, porém insiro um sysout, mas não me trás resultado, saberia me informar que há de errado?

@Service
public class OrdenacaoService {
	
	@Autowired
	private WebClient webClient;

	public Page<OrdenacaoDTO> obterListaExterna(Pageable pageable) {

		Mono<OrdenacaoDTO> monoOrdenacao = this.webClient
				.method(HttpMethod.GET)
				.uri("/numbers?page={pageable}", pageable)
				.retrieve().bodyToMono(OrdenacaoDTO.class);

		Page<OrdenacaoDTO> ordenacao = monoOrdenacao.block();
			
		return ordenacao.map(x -> new OrdenacaoDTO());
	}
}
@RestController
@RequestMapping(value = "/numbers")
public class OrdenacaoController {
	
	@Autowired
	private OrdenacaoService ordenacaoService;
	
	@GetMapping("?page={id}")
	public Page<OrdenacaoDTO> obterNumeros(
			@RequestParam(value = "id", defaultValue = "0") Long id, Pageable pageable){
		Page<OrdenacaoDTO> newPage = ordenacaoService.obterListaExterna(pageable);
		System.out.println(newPage);
		return newPage.map(x -> new OrdenacaoDTO());
	}

}