Como mapear mensagem de erro no FeignClient
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.