Отдельное сопоставление исключений для веб-службы REST / службы веб-интерфейса - PullRequest
2 голосов
/ 25 июля 2011

Я написал веб-сервис с Джерси . Этот веб-сервис предоставляет как методы REST для доступа через клиент REST , так и пользовательский WebUI (в основном простой HTML).

Эти два аспекта обслуживаются двумя отдельными классами "Restlet".

Я зарегистрировал уникальный сопоставитель исключений, который печатает всю ошибку и трассировку стека при возникновении непредвиденного исключения. Эти исключения могут быть вызваны либо службой REST, либо WebUI.

Я хотел бы возвращать трассировку стека в виде простого текста всякий раз, когда исключение возвращается клиенту REST, и красивую страницу с ошибкой HTML, когда это происходит на стороне WebUI.

Я подумал, что смогу сделать это, исследуя Http-заголовки "Accepts" запроса, ища mime-тип HTML. Но запрос недоступен в интерфейсе ExceptionMapper .

Как бы вы это сделали?

Ответы [ 2 ]

2 голосов
/ 25 июля 2011

Как это для идеи:

Напишите фильтр / слушатель сервлета, который хранит объект HTTP-запроса в переменной Thread Local, которую затем можно прочитать из преобразователя исключений.

NB:Весной этого можно достичь, используя RequestContextFilter или RequestContextListener

, который будет добавлен в web.xml

<listener>
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>

используется следующим образом:

ServletRequestAttributes reqAttr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
HttpServletRequest req = reqAttr.getRequest(); 

Если вы не используете Spring, то исходный код может дать вам представление о том, как свернуть свой собственный.Надеюсь, это поможет.

1 голос
/ 21 сентября 2011

ExceptionMapper отображает исключение в ответ, и ответ затем обрабатывается, как если бы он был возвращен методом ресурса.Из этого следует, что если ответ возвращает бин как его сущность, а не тип носителя, алгоритм в разделе 3.8 спецификации JAX-RS вступит в силу.

Таким образом, вы можете сделать следующее:

  1. Определить компонент (или использовать сам тип исключения в качестве компонента)
  2. Определить MBW дляbean-компонент для типов медиа, которые вы хотите вернуть (text / html, application / json, text / plain)
  3. ExceptionMapper возвращает ответ, содержащий экземпляр bean-компонента (но без медиа-типа)

Среда выполнения JAX-RS будет затем использовать заголовок Accept для получения правильного ответа (т. Е. Выбрать ваш MessageBodyWritter для получения ответа).

Если дополнительная информация из запроса по-прежнему требуется в самом преобразователе, единственноеРешение, которое я вижу, состоит в том, чтобы создать собственное исключение, внедрить Request в свой класс ресурсов и включить ссылку на запрос в исключении, которое вы выбросили.

Надеюсь, это поможет.

- Сантьяго

...