Como mapear mensagem de erro no FeignClient

Como mapear mensagem de erro no FeignClient
Photo by charlesdeluvio / Unsplash

Possuo um Feign Client para fazer requisições em serviços de terceiros.

Desejo exibir a mensagem de erro corretamente de acordo com os erros apresentados.

Para isso basta capturar os erros de acordo com a exceção lançada pelo cliente Feign.

Possuo o seguinte método, que faz a busca de um usuário em uma api externa:

public EntityModel<UserDTO> findUserByCpf(@PathVariable(value = "cpf")String cpf)  {
    UserDTO user = null;
    user = demoClient.getUser(cpf);

    return EntityModel.of(user);
}

O método acima está simplificado para um melhor entendimento, desejo complementar a implementação deste método para tratar os erros adequadamente, para poder "setar" a mensagem de erro corretamente de acordo com o erro recebido pelo Feign client.

Basta adicionar um bloco try ... catch e tratar os erros de acordo com as exceções enviadas pelo Feign Client.

public EntityModel<UserDTO> findUserByCpf(@PathVariable(value = "cpf")String cpf)  {
    UserDTO user = null;
    try {
        user = demoClient.getUser(cpf);
    } catch (Exception ex) {
        if (ex instanceof FeignException.BadRequest) {
            String bodyErrorMessage = ((FeignException.BadRequest) ex).contentUTF8();
            DemoClientErrorHandler democlienterror = objectMapperDefaultErrorConfig().readValue(bodyErrorMessage, DemoClientErrorHandler.class);
            }
    }
    //tratar os outros tipos de erros
    return EntityModel.of(user);
}

Basicamente a minha entidade DemoClientErrorHandler é um mapeamento em classes Java (POJO) de um "erro" da API externa que estou utilizando.

Para este exemplo eu usei apenas o BadRequest mas podem ser utilizados quantos forem necessários, basta seguir o que a documentação direciona.

Para implementar este código utilizei esta referência.