Выполнение ОТДЫХА в ОСГИ
Вы упоминаете REST и Servlets в этом вопросе. Если вы используете REST в OSGi, то JAX-RS Whiteboard - самый простой способ сделать что-либо. Если вы хотите использовать сырые сервлеты, то вам поможет Http Whiteboard. Обе модели позволяют легко обрабатывать исключения.
Обновление
Чтобы людям было проще понять, как это работает, я создал рабочий пример на GitHub , который охватывает обработку ошибок в сервлетах и JAX-RS.
Использование HTTP доски
HTTP-доска позволяет регистрировать сервлеты как службы OSGi, а затем использовать их для обработки запросов. Один из типов обработки запросов - это страница error .
.
Страницы ошибок регистрируются с помощью свойства osgi.http.whiteboard.servlet.errorPage
. Значение этого свойства - одна или несколько строк, содержащих либо:
- Полное имя класса для исключения, которое должно быть обработано
- Трехзначный код ошибки
Спецификация OSGi описывает это в примере , а на других страницах перечисляются атрибуты , которые можно использовать для выяснения того, что пошло не так.
Например, этот сервлет будет вызываться для IOException
, NullPointerException
и для кодов состояния 401
и 403
:
@Component
@HttpWhiteboardServletErrorPage(errorPage = {"java.io.IOException", "java.lang.NullPointerException", "401", "403"})
public class MyErrorServlet extends HttpServlet implements Servlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws Exception {
Throwable throwable = (Throwable) request
.getAttribute("javax.servlet.error.exception");
Integer statusCode = (Integer) request
.getAttribute("javax.servlet.error.status_code");
// Do stuff with the error
}
}
N.B. Я использовал аннотации типов свойств компонентов OSGi R7, чтобы их было проще читать. Он будет одинаково хорошо работать со старыми версиями DS и Http Whiteboard.
Использование доски JAX-RS
Доска JAX-RS позволяет использовать любой из расширений JAX-RS в качестве службы доски . В этом случае вы хотите ExceptionMapper
.
В этом примере мы добавляем обработчик для IOException
@Component
@JaxrsExtension
public class MyExceptionMapper implements ExceptionMapper<IOException> {
Response toResponse(IOException e) {
// Create a response
}
}