3
respostas

Erro ao consumir uma api

Olá pessoal, resolvi criar uma api para fixar os conteudos passados no curso, primeiramente estou fazendo uma api vai mostrar a cotação do dolár diário, porém ao executar o programa é lançaco um erro interno (ERRO 500), verifiquei a URL que estou passando no postman e os dados são retornados, porem ao chamar pelo programa é gerado este erro e não consegui identificar, abaixo as classes que utilizei: Classe DTO

public class DolarDiarioDto {

    private String cotacaoCompra;
    private String cotacaoVenda;
    private String dataHoraCotacao;
    /* getters e setters*/

Classe Service

import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import br.com.cotacaoapi.model.dto.DolarDiarioDto;
import br.com.cotacaoapi.util.BaseUrlConstante;


@Service
public class CotacaoService {

    public DolarDiarioDto retornarValorDiario()  {
        RestTemplate restTemplate = new RestTemplate();

        String uri = BaseUrlConstante.BASE_URL+ BaseUrlConstante.DOLAR_DIARIO+"'07-02-2021'";
        System.out.println("### URL ####\n");
        System.out.println(uri);
        DolarDiarioDto  retorno = restTemplate.getForObject("https://olinda.bcb.gov.br/olinda/servico/PTAX/versao/v1/odata/CotacaoDolarDia(dataCotacao=@dataCotacao)?%40dataCotacao='07-02-2021'", DolarDiarioDto.class);

        return retorno;
    }
}

Controller

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


import br.com.cotacaoapi.model.dto.DolarDiarioDto;
import br.com.cotacaoapi.service.CotacaoService;

@RestController
@RequestMapping("/cotacao")
public class CotacaoApiController {
    @Autowired
    private  CotacaoService cotacaoService;

    @GetMapping("/dolardiario")
    public ResponseEntity<DolarDiarioDto> exemplo(){


            DolarDiarioDto dados = cotacaoService.retornarValorDiario();
            return ResponseEntity.ok(dados);

    }
}

Pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.2</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>br.com.cotacaoapi</groupId>
    <artifactId>cotacaoapi</artifactId>
    <version>0.0.1</version>
    <name>cotacaoapi</name>
    <description>API para cotação Dólar</description>
    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>2020.0.3</spring-cloud.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
    </dependencies>


    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>
3 respostas

Erro: 2021-07-02 21:15:38.903[0;39m [31mERROR[0;39m [35m25019[0;39m [2m---[0;39m [2m[nio-8089-exec-2][0;39m [36mo.a.c.c.C.[.[.[/].[dispatcherServlet] [0;39m [2m:[0;39m Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.web.client.HttpServerErrorException$InternalServerError: 500 Internal Server Error: [/{ "codigo" : 500, "mensagem" : "Erro desconhecido" }/]] with root cause

org.springframework.web.client.HttpServerErrorException$InternalServerError: 500 Internal Server Error: [/{ "codigo" : 500, "mensagem" : "Erro desconhecido" }/] at org.springframework.web.client.HttpServerErrorException.create(HttpServerErrorException.java:100) ~[spring-web-5.3.8.jar:5.3.8] at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:188) ~[spring-web-5.3.8.jar:5.3.8] at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:125) ~[spring-web-5.3.8.jar:5.3.8] at org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63) ~[spring-web-5.3.8.jar:5.3.8] at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:819) ~[spring-web-5.3.8.jar:5.3.8] at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:777) ~[spring-web-5.3.8.jar:5.3.8] at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:711) ~[spring-web-5.3.8.jar:5.3.8] at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:334) ~[spring-web-5.3.8.jar:5.3.8] at br.com.cotacaoapi.service.CotacaoService.retornarValorDiario(CotacaoService.java:21) ~[classes/:na] at br.com.cotacaoapi.controller.CotacaoApiController.exemplo(CotacaoApiController.java:28) ~[classes/:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78) ~[na:na] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:567) ~[na:na] at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:197) ~[spring-web-5.3.8.jar:5.3.8] at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:141) ~[spring-web-5.3.8.jar:5.3.8] at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.3.8.jar:5.3.8] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) ~[spring-webmvc-5.3.8.jar:5.3.8] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.8.jar:5.3.8] at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.8.jar:5.3.8] at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1063) ~[spring-webmvc-5.3.8.jar:5.3.8] at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963) ~[spring-webmvc-5.3.8.jar:5.3.8] at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.8.jar:5.3.8] at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.8.jar:5.3.8] at javax.servlet.http.HttpServlet.service(HttpServlet.java:655) ~[tomcat-embed-core-9.0.48.jar:4.0.FR]

Oi Marcos,

Pela exception o erro nao esta relacionado com o spring em si, mas sim com essa api externa que voce esta chamando na classe CotacaoService.

Da uma verificada se a URL dessa api e parametros estao corretos.

Oi Rodrigo, refiz totalmente o projeto, comecei a consumir uma URL do via CEP e deu certo consegui acessar pela aplicação, utilizei a mesma base url do post anterior para consumir uma api do banco central que retorna uma lista de moedas, neste caso estou com uma duvida de como fazer para retornar uma lista com o rest template.

estou pegando os dados deste endpoint https://olinda.bcb.gov.br/olinda/servico/PTAX/versao/v1/odata/Moedas Mas não consegui fazer retornar dados direto da aplicação. Seria possível mostrar um exemplo de como retornar uma lista usando o RestTemplate?