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!