#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
помощью), чтобы определить, как в конечном итоге создать точный ответ об ошибке.