Глобальная обработка исключений сервлетов в OSGI. Как? - PullRequest
0 голосов
/ 14 ноября 2018

Есть ли способ как-то глобально обрабатывать непроверенные исключения в osgi (karaf), которые были брошены в сервлеты?

Я имею в виду что-то вроде Spring, где есть @ControllerAdvice, где вы можете указать методы для каждого типа исключения и обработать его.

Я хотел бы объединить обработку исключений в моем API для отдыха, который предоставляет сервисы OSGI.

1 Ответ

0 голосов
/ 14 ноября 2018

Выполнение ОТДЫХА в ОСГИ

Вы упоминаете 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
    }
}
...