Como tratar / enviar ao cliente erros de Web Service?
7 respostas
webservicespringrestexception
R
Rafael_Nascimento
Tenho 2 aplicações:
Uma expõe um web service para salvar a entidade Pessoa (usando springboot). A entidade Pessoa tem um campo email que é unique:
//web service com springboot@PostMapping(value="/save",produces={MediaType.APPLICATION_XML_VALUE,MediaType.APPLICATION_JSON_VALUE},consumes={MediaType.APPLICATION_XML_VALUE,MediaType.APPLICATION_JSON_VALUE})publicPessoasave(@RequestBodyPessoapessoa){// cmapo email é unique, se repetir dá erro... returnpessoaRepository.save(pessoa);}
A outra app consome o serviço enviando a entidade Pessoa para salvar (usando Client API do JavaEE sem springboot):
O campo email da entidade Pessoa é unique, e ao salvar pode disparar alguma exception de violação de constraint.
Minha é dúvida é, se ocorrer um erro, como dizer isso ao cliente?
Em comunicação usando o protocolo HTTP, você deve usar os códigos de erro apropriados. No seu caso, talvez o código mais apropriado seja o 409 (ou o 412):
The 409 (Conflict) status code indicates that the request could not be completed due to a conflict with the current state of the target resource. This code is used in situations where the user might be able to resolve the conflict and resubmit the request. The server SHOULD generate a payload that includes enough information for a user to recognize the source of the conflict.
obs.: Junto com o código, vc retorna uma mensagem com o detalhe do erro.
Entendi. Mas dado esse código que eu implementei até agora, como que web service enviaria o código de erro para o cliente? E como que o cliente faria a verificação pra checar se a entidade foi salva com sucesso?
F
Fabio_Dos_Reis
Rafael, um exemplo seria assim.
Você precisaria de uma classe de regra de negocio, no teu exemplo você diz que não pode haver dois emails iguais, então antes de inserir um email você deve procurar se esse email já existe no banco de dados, caso exista você poderia lançar uma exception de regra de negócio, capturar essa exception no teu controller e devolver na resposta do HTTP, com spring boot da para fazer com a classe ResponseEntity.
Só um exemplo vocè poderia trocar o INTERNAL_SERRVER_ERROR, pelo código de erro mais adequado para você como sugeriu o amigo lucastody.
L
Lucas_Camara
Se for erro de negocio retornar algum código 4xx. Se for erro do sistema mesmo (erro de infra, inesperado, banco, etc.) retorna erro 5xx.
R
Rafael_Nascimento
Legal, obrigado, pessoal, mas do lado do cliente como ficaria? Como ela faria a checagem se o objeto persistiu com sucesso ou deu erro no WS e qual foi o erro?