Специфичный для URI обработчик исключений в JAX-RS

#jersey #jax-rs #guice

#jersey #jax-rs #guice

Вопрос:

Я использую Jersey и Guice в качестве своего IOC-контейнера. Я хотел бы знать, возможно ли связать ExceptionMapper с определенным URI. Причина этого в том, что я хочу сопоставить одно и то же исключение по-разному в зависимости от того, какой URI был посещен. Например, предположим, что у меня есть следующие два картографа исключений для моего пользовательского исключения:

 public class MyExceptionMapperForFirstURI implements
  ExceptionMapper<MyException> {..return response based on first URI..}

public class MyExceptionMapperForSecondURI implements
  ExceptionMapper<MyException> {..return response based on second URI..}
  

Насколько я понимаю, вы привязываете ExceptionMapper в своем ServletModule следующим образом:

 public class MyModule extends ServletModule {

    @Override
    public void configureServlets() {
        super.configureServlets();
        bind(MyCustomExceptionMapper.class);
    }
}
  

Как бы я поступил с привязкой MyExceptionMapperForFirstURI и MyExceptionMapperForSecondURI чтобы они были связаны с правильными URI. Возможно ли это, и если возможно: это правильный способ сделать это?

Ответ №1:

Это довольно поздний ответ 😉 но вы всегда можете ввести UriInfo и перейти к нему. Итак,

 @Context
UriInfo uriInfo;
  

…..

 if (matchesA(uriInfo.getAbsolutePath())) {
    // do something
}
  

Комментарии:

1. Jip, это то, что я сделал в конце (см. Мой комментарий к ответу ниже). Я отмечу это как правильный ответ, чтобы выделить его для других.

2. Куда вы поместили этот код? В ExceptionMapper ?

3. Jip. Теперь есть один ExceptionMapper подкласс, который имеет доступ к вышеупомянутому UriInfo , который я использую для расширения.

Ответ №2:

Не уверен, как выглядят URI вашего приложения, но если возможно разделить ваше приложение на два сервлета или фильтра, то вы можете сделать это так, то есть один сервлет / фильтр обслуживает один набор ресурсов и включает первый mapper, а другой сервлет / фильтр обслуживает другой набор ресурсов.другой набор ресурсов и включает другое средство отображения.

Если это пользовательские исключения, вы также можете передать запрос в качестве аргумента для исключения и иметь только один mapper — выберите ответ на основе uri запроса в mapper.

Комментарии:

1. Спасибо за ответ. Проблема в том, что у меня нет никаких сервлетов, поскольку я использую Jersey для обслуживания своих ресурсов. Я использовал UriInfo (введенный с @Context помощью), чтобы определить, как в конечном итоге создать точный ответ об ошибке.