Olá, Rodrigo!
No código do AdocaoService
, são lançadas três exceções diferentes, cada uma com sua respectiva mensagem:
- "Pet já adotado"
- "Pet com adoção em andamento"
- "Tutor com máximo de adoções"
No caso do AdocaoController
, o método solicitar()
está configurado para capturar apenas uma exceção do tipo IllegalStateException
, que é a exceção lançada quando o pet já foi adotado ou quando o tutor já atingiu o máximo de adoções permitidas.
Por isso, quando você tenta adotar um pet que já foi adotado ou um tutor que já atingiu o máximo de adoções, a exceção é capturada e a respectiva mensagem é retornada.
No entanto, quando você tenta adotar um pet que está com uma adoção em andamento, a exceção lançada é do tipo UnsupportedOperationException
. Como o método solicitar()
do AdocaoController
não está configurado para capturar esse tipo de exceção. A exceção será propagada pela pilha de chamadas até "explodir". E será impresso um rastreamento de pilha (stack trace) no console da aplicação.
Para resolver esse problema, uma das soluções é você poder adicionar um novo bloco catch
no método solicitar()
do AdocaoController
para capturar a exceção UnsupportedOperationException
. Veja como ficaria:
@PostMapping
@Transactional
public ResponseEntity<String> solicitar(@RequestBody @Valid SolicitacaoDeAdocaoDTO dados){
try {
this.service.solicitar(dados);
}catch (IllegalStateException ex){
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ex.getMessage());
}catch (UnsupportedOperationException ex){
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ex.getMessage());
}
return ResponseEntity.ok("Adoção solicitada com sucesso!");
}
Dessa forma, quando uma exceção do tipo UnsupportedOperationException
for lançada, ela será capturada e a respectiva mensagem de erro será retornada.
Espero ter ajudado e bons estudos!