Olá pessoal, estou consumindo uma API com Webclient e estou com algumas duvidas de como exibir corretamente os erros listados pela API.
Em alguns tipos de erro como o 401 a API retornará o corpo abaixo, nesse caso consegui tratar este retorno normalmente no meu controller adivce.
{
"timestamp": "2023-04-17T17:56:03.838+0000",
"status": 401,
"error": "Unauthorized",
"message": "Unauthorized",
"path": "/api/estudante/matricula"
}
Mas quando a API gera um erro 400 é retornado o corpo abaixo
"errors": [
{
"timestamp": "2023-04-18 13:28:05",
"detalhe": "Não é permitido aluno sem matricula"
},
{
"timestamp": "2023-04-18 13:28:05",
"detalhe": "Não é permitido aluno sem CPF."
},
{
"timestamp": "2023-04-18 13:28:05",
"detalhe": "Não é permitido aluno sem Responsavel."
}
]
Como posso fazer para retornar este corpo de resposta utilizando webclient? abaixo os codigos que estou utilizando:
webClientConfig.createWebClient()
.post()
.uri(uri)
.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
.header(HttpHeaders.AUTHORIZATION, recuperarToken())
.accept(MediaType.APPLICATION_JSON)
.retrieve()
.onStatus(HttpStatus.UNAUTHORIZED::equals,response -> response.bodyToMono(UnauthorizedException.class))
.onStatus(HttpStatus.FORBIDDEN::equals,response -> response.bodyToMono(ForbiddenException.class))
.onStatus(HttpStatus.INTERNAL_SERVER_ERROR::equals,response -> response.bodyToMono(BusinessException.class))
.bodyToMono(RetornoAluno.class)
.block();
Controller Advice
@ExceptionHandler(UnauthorizedException.class)
@ResponseStatus(value = HttpStatus.UNAUTHORIZED)
public ErrorMessageAlunoDto unauthorizedException(UnauthorizedException ex, WebRequest request) {
ErrorMessageAlunoDto erro = new ErrorMessageAlunoDto(LocalDateTime.now()
,HttpStatus.UNAUTHORIZED.value()
,ex.getMessage()
,ex.getLocalizedMessage()
,request.getDescription(false));
return erro;
}
@ExceptionHandler(BusinessException.class)
@ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR)
public ErrorMessageAlunoDto businessException(BusinessException ex, WebRequest request) {
ErrorMessageAlunoDto erro = new ErrorMessageAlunoDto (LocalDateTime.now()
,HttpStatus.INTERNAL_SERVER_ERROR.value()
,ex.getMessage()
,ex.getLocalizedMessage().stripTrailing()
,request.getDescription(false));
return erro;
}
@ExceptionHandler(ForbiddenException.class)
@ResponseStatus(value = HttpStatus.FORBIDDEN)
public ErrorMessageAlunoDto forbiddenException(ForbiddenException ex, WebRequest request) {
ErrorMessageAlunoDto erro = new ErrorMessageAlunoDto(LocalDateTime.now()
,HttpStatus.FORBIDDEN.value()
,ex.getMessage()
,ex.getLocalizedMessage().stripTrailing()
,request.getDescription(false)
);
return erro;
}