Pergunta

Eu tenho um aplicativo Android que consome serviços RESTful usando AndroidAnnotations e Spring Rest Template.

Os serviços estão sendo consumidos corretamente, mas quando o serviço RESTful lança uma exceção não tratada, o aplicativo Android para de funcionar e é fechado, mesmo com o try catch abrangendo o consumo do serviço.

aplicativo Android:

@RestService
protected StudentRESTfulClient mStudentRESTfulClient;

@Click(R.id.register_button)
public void register(Student user) {
    try {
        this.mStudentRESTfulClient.insert(user);
    } catch (Exception exception) {
        // This block is not executed...
    }
}

aplicativo repousante:

@POST
public Student insert(Student entity) {
    this.getService().insert(entity); // Throw the exception here!
    return entity;
}

Sei que a exceção não está sendo tratada no serviço RESTful, mas quero que minha aplicação Android consiga capturar esse tipo de problema e exibir uma mensagem amigável ao usuário.Mas o seguinte erro ocorre mesmo com o try catch:

01-11 00:44:59.046: E/AndroidRuntime(5291): FATAL EXCEPTION: pool-1-thread-2
01-11 00:44:59.046: E/AndroidRuntime(5291): org.springframework.web.client.HttpServerErrorException: 500 Internal Server Error
01-11 00:44:59.046: E/AndroidRuntime(5291): at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:78)
01-11 00:44:59.046: E/AndroidRuntime(5291): at org.springframework.web.client.RestTemplate.handleResponseError(RestTemplate.java:524)

Repositório Git se quiserem ver todo o projeto: https://github.com/veniltonjr/msplearning

Já, obrigado!

Foi útil?

Solução

A maneira de mostrar ao usuário uma mensagem amigável em caso de exceção do servidor é retornar um código de status de erro de Jersey e então o lado do Android pode lidar com essa resposta e executar a ação para exibir uma mensagem ao usuário informando que algo está errado.

Portanto, no seu código Jersey, você pode adicionar tratamento de exceções:

@POST
public Response insert(Student entity) {
    Response r;
    try {
        this.getService().insert(entity); // Throw the exception here!
        r = Response.ok().entity(entity).build();
    } catch (Exception ex) {
        r = Response.status(401).entity("Got some errors due to ...!").build();
    }
    return r;
}

No lado do Android, você pode capturar a string da entidade de erro "Got some errors due to ...!" e então você pode exibir a mensagem apropriada ao usuário sobre o que aconteceu.Por exemplo:

Lado Android:

HttpClient client = new DefaultHttpClient();
HttpResponse response = client.execute(post);
String responseText = EntityUtils.toString(response.getEntity());

Isso garantirá que, em caso de exceção REST, o cliente Android possa tratar o erro e exibir uma mensagem ao usuário.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top