Android не улавливает исключения RESTful Джерси
-
22-12-2019 - |
Вопрос
У меня есть приложение для Android, которое использует службы RESTful с использованием AndroidAnnotations и шаблона Spring Rest.
Службы используются правильно, но когда служба RESTful выдает необработанное исключение, приложение Android перестает работать и закрывается, даже если попытка catch охватывает потребление службы.
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...
}
}
спокойное-приложение:
@POST
public Student insert(Student entity) {
this.getService().insert(entity); // Throw the exception here!
return entity;
}
Я знаю, что это исключение не обрабатывается в службе RESTful, но я хочу, чтобы мое приложение Android могло обнаруживать проблемы такого типа и отображать пользователю дружественное сообщение.Но следующая ошибка возникает даже при попытке поймать:
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)
Репозиторий Git, если они хотят просмотреть весь проект: https://github.com/veniltonjr/msplearning
Уже, спасибо!
Решение
Способ показать пользователю дружелюбное сообщение в случае исключения сервера — вернуть код состояния ошибки из Джерси, а затем сторона Android может обработать этот ответ и выполнить действие, чтобы отобразить пользователю сообщение о том, что что-то идет не так.
Итак, в ваш код Джерси вы можете добавить обработку исключений:
@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;
}
На стороне Android вы можете перехватить строку объекта ошибки. "Got some errors due to ...!"
а затем вы можете отобразить пользователю соответствующее сообщение о том, что произошло.Например:
Сторона Android:
HttpClient client = new DefaultHttpClient();
HttpResponse response = client.execute(post);
String responseText = EntityUtils.toString(response.getEntity());
Это гарантирует, что в случае исключения REST клиент Android сможет обработать ошибку и отобразить сообщение пользователю.