Last active
August 29, 2015 14:07
-
-
Save rafarocha/ffd7837c45d27202b123 to your computer and use it in GitHub Desktop.
Tratabilidade de exceções no cliente
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Imagine uma tela de busca de produtos por faixa de preço através da consulta a um serviço REST | |
Deseja-se que o cliente possa formatar a mensagem e enviar para o usuário | |
Digamos que a chamada getProdutos na linha 10 retorne http status code 422 e no body a mensagem | |
{ "token":"1N1H2TT014102023424","errors":["FAIXA_PRECO_INVALIDA","NAO_PERMITIDO_VALOR_NEGATIVO"] } | |
Entenda que usualmente o http status code 422 indica que houve um problema semântico na entidade | |
Um ClientException significa que algum problema ocorreu no request, seja de infra ou de negócio | |
A idéia é que o cliente informe um properties que inclua a sua própria mensagem | |
FAIXA_PRECO_INVALIDA = A faixa de preço está inválida cowboy! | |
Em estudo: | |
- Mensagens formatadas com parâmetros | |
- Customizar em apenas uma mensagem | |
---------------- | |
// caso simples | |
try { | |
Client client = new ClientImpl( getConfiguration(), getBusinessMessage() ); | |
List<Produto> produtos = client.getProdutos( faixaPreco(-100, 200) ); | |
} catch( ClientException exception ) { | |
if ( exception.isCausedByUnprocessableEntity() ) { // ocorre quando http status code for 422 | |
throw new BusinessException( exception.getFormattedErrorMessages() ); // List<String> | |
} | |
throw InfraException("deu bronca geral"); | |
} | |
// caso mensagem parametrizada | |
// em estudo ... | |
---------------- | |
// comportamento interno do client | |
if ( responseCode == UNPROCESSABLE_ENTITY == 422 ) { | |
// registrar em log informações | |
UnprocessableEntityException uee = new UnprocessableEntityException( errors ); | |
throw new ClientException("problema semântico entidade", uee, responseCode); | |
} | |
class UnprocessableEntityException { | |
private List<String> errors; | |
public UnprocessableEntity(List<String> errors) { | |
this.errors = errors; | |
} | |
public List<String> getErrors() { | |
return errors; | |
} | |
} | |
public class ClientException extends Exception { | |
private int statusCode = -1; | |
private boolean causedByUnprocessableEntity = false; | |
// outros atributos | |
public ClientException(String message, Throwable cause, int statusCode) { | |
this(message, cause); | |
this.statusCode = statusCode; | |
if( cause instanceof UnprocessableEntityException ) { | |
if( statusCode != UNPROCESSABLE_ENTITY ) { // UNPROCESSABLE_ENTITY == 422 | |
throw new IllegalArgumentException("causa diferente do statuscode."); | |
} | |
this.causedByUnprocessableEntity = true; | |
} | |
} | |
public boolean isCausedByUnprocessableEntity() { | |
return causedByUnprocessableEntity; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
A mensagem pode vir formatada, mas pode ser que o cliente deseje enviar uma própria