Android non cattura le eccezioni riposanti in jersey
-
22-12-2019 - |
Domanda
Ho un'applicazione Android che consuma servizi riposanti utilizzando Androidannotazioni e modello di riposo a molla.
I servizi vengono consumati correttamente, ma quando il servizio riposo genera un'eccezione non gestita, l'applicazione Android si arresta di funzionare ed è chiusa, anche con il calibro di prova che comprende il consumo di servizio.
Android-app:
@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...
}
}
.
Respul-app:
@POST
public Student insert(Student entity) {
this.getService().insert(entity); // Throw the exception here!
return entity;
}
.
So che l'eccezione non viene trattata in servizio riposante, ma voglio che la mia applicazione Android possa catturare questo tipo di problema e visualizzare un messaggio amichevole all'utente. Ma il seguente errore si verifica anche con il fermo Prova:
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)
.
Repository Git Se vogliono guardare l'intero progetto: https://github.com/veniltonjr/msPlearning
Soluzione
Il modo per mostrare all'utente un messaggio amichevole in caso di eccezione del server è restituire un codice di stato di errore da Jersey e quindi il lato Android può gestire questa risposta e eseguire l'azione per visualizzare un messaggio all'utente che qualcosa va storto.
Quindi nel codice Jersey, è possibile aggiungere la gestione delle eccezioni:
@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;
}
.
Sul lato Android, è possibile catturare la stringa di entità errori "Got some errors due to ...!"
e quindi è possibile visualizzare il messaggio appropriato all'utente su ciò che è successo.Ad esempio:
Side Android:
HttpClient client = new DefaultHttpClient();
HttpResponse response = client.execute(post);
String responseText = EntityUtils.toString(response.getEntity());
.
Ciò garantirà che in caso di eccezione di riposo, Android client può gestire l'errore e visualizzare un messaggio all'utente.