Android no atrapa las excepciones de descanso de Jersey
-
22-12-2019 - |
Pregunta
Tengo una aplicación de Android que consume servicios de descanso utilizando AndroidAnnotations y plantilla de descanso de primavera.
Los servicios se están consumiendo correctamente, pero cuando el servicio de descanso lanza una excepción no controlada, la aplicación Android se detiene en funcionamiento y está cerrada, incluso con la captura de intentos que abarca el consumo de servicios.
Android-Aplicación:
@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...
}
}
Aplicación de descanso:
@POST
public Student insert(Student entity) {
this.getService().insert(entity); // Throw the exception here!
return entity;
}
Sé que la excepción no se está tratando en un servicio reparador, pero quiero que mi aplicación de Android pueda captar este tipo de problema y mostrar un mensaje amigable para el usuario. Pero el siguiente error se produce incluso con la prueba intente:
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)
Repositorio de git Si desea ver todo el proyecto: https://github.com/veniltonjr/msploring
Solución
La forma de mostrar al usuario Un mensaje amigable en caso de excepción del servidor es devolver un código de estado de error de Jersey y luego el lado de Android puede manejar esta respuesta y hacer la acción para mostrar un mensaje al usuario que algo sale mal.
Entonces, en su código de Jersey, puede agregar un manejo de excepciones:
@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;
}
En el lado de Android, puede capturar la entidad de error String GreenacodiCetGode y luego puede mostrar el mensaje apropiado al usuario sobre lo que sucedió.Por ejemplo:
Lado de Android:
HttpClient client = new DefaultHttpClient();
HttpResponse response = client.execute(post);
String responseText = EntityUtils.toString(response.getEntity());
Esto asegurará que, en caso de excepción de reposo, el cliente Android puede manejar el error y mostrar un mensaje al usuario.