2013-10-23 3 views
5

Джерси поддерживает ExceptionMappers как способ обработки дурных вещей, но это работает только в том случае, если вызов достиг моего кода. Если кто-то boffs URL-адрес, скажем, http://host/fubar вместо http://host/foobar, то он возвращает общий 404.Джерси: общий метод улавливания всех ошибок?

мне нужно ухватить эти boffed URL-адресов и перенаправление на страницу моего выбора, но после нескольких часов я не могу похоже, найдут правильную конфигурацию, чтобы это произошло. Я прохожу через отладчик, но я не нахожу места, где я бы перехватил какую-то конфигурацию, чтобы перенаправить такие 404 на страницу по своему выбору.

Редактировать: Обратите внимание, что пользовательский механизм исключения исключений для любого исключения WebApplicationException игнорируется Джерси (1.17.1). Вместо этого он обращается к другому методу обработки. Вот фрагмент кода из ContainerResponse.java Джерси:

if (cause instanceof WebApplicationException) { 
    mapWebApplicationException((WebApplicationException)cause); 
} else if (!mapException(cause)) { ... } 

Это mapWebApplicationException ((WebApplicationException) причина) собственная обработка Джерси, поэтому он никогда не попадает в метод mapException (причина) в ELSEIF который где пользовательские картостроители являются вызывается.

ответ

1

Создание customExceptionMapper должно решить эту проблему.

@Provider 
public class NotFoundMapper implements ExceptionMapper<NotFoundException>{ 

public Response toResponse(NotFoundException exception){ 

    // do your custom processing here.. 
} 

} 
+1

К сожалению, нет. Пользовательский сопоставитель не будет вызываться для любого исключения WebApplicationException. ContainerResponse.mapMappableContainerException, строка 398 (версия 1.17.1), сначала ищет этот случай и переадресовывает его собственный обработчик. Только если это какой-то другой тип исключения, он ищет сопоставленные исключения. –

2

Обращаясь Баунти:

Это может быть ошибка в Джерси, как общепринятый способ для обработки исключений не работает для WebApplicationException. Я ищу обход, отчет об ошибке или информацию, которую он исправил в более поздних версиях.

Вы можете создать ExceptionMapper, что попадается RuntimeException, а затем проверить, если исключение является экземпляром WebApplicationException:

@Provider 
public class CustomExceptionMapper implements ExceptionMapper<RuntimeException> { 

    @Override 
    public Response toResponse(RuntimeException e) { 

     if (e instanceof WebApplicationException) { 
      return ((WebApplicationException) e).getResponse(); 
     } 

     return Response.serverError().build(); 
    } 
} 
+1

это должно сработать, мы поймаем все, как это, и зарегистрируем неприятную ошибку, если кто-то выбрасывает исключение webapplication. –

+0

Это все равно не получилось бы с помощью кода ContainerResponse.java, о котором я упоминал. Выбранный URL-адрес никогда не будет доходить до моих экземпляров-исключений, потому что убранный URL-адрес - это исключение WebApplicationException, которое попадает в первое предложение if if if ContainerResponse и, таким образом, оно никогда не попадает в блок else-if, в котором будут вызываться мои настраиваемые исключения. , Единственное решение, которое я могу придумать, состоит в том, чтобы каждый запрос попал на мой сервер, выставлял конечную точку/* REST, а затем маршрутизировал туда оттуда, что затем обходит все приятные вещи @PATH. Jaxws предоставляет :( –

+1

@ChrisKessel. По крайней мере такое поведение имеет был исправлен в Джерси 2.x. –

1

попытался с помощью jersey2.version = 2.19, и она работает не знать abt 1+ версия

демо URL: https://jerseyexample-ravikant.rhcloud.com/rest/jws/getUserList/

вы можете изменить его на что-либо другое, и будет таковой ниже сообщ ошибки

@Provider 
public class EntityNotFoundException extends WebApplicationException implements ExceptionMapper<NotFoundException> 
{ 

    private static final long serialVersionUID = 7886520141629139380L; 

    //@Override 
    public Response toResponse(NotFoundException arg0) { 

     StringBuilder response = new StringBuilder("<response>"); 
     response.append("<status>ERROR</status>"); 
     response.append("<message>The method you are looking for does not exist </message>"); 
     response.append("<time>" + new Date().toString() + "</time>"); 
     response.append("</response>"); 
     return Response.status(404).entity(response.toString()).type(MediaType.APPLICATION_XML).build(); 
    } 


} 
Смежные вопросы