2015-11-16 6 views
2

Я использую трикотаж для веб-служб REST.ExceptionMapper не работает как ожидалось

Я обрабатываю все 404 ответов, бросая NotFoundException (пакет com.sun.jersey.api) всякий раз, когда я не получаю никакого объекта из уровня сервиса.

например.

@GET 
@Path("/{folderID}") 
@Produces(MediaType.APPLICATION_JSON) 
public Response getFolder(@PathParam("folderID") int folderID) { 
     . 
     . 
     . 
     Folder folderObj = folderService.getFolder(folderID); 
     if(folderObj == null){ 
      throw new NotFoundException("Folder with ID '"+folderID+"' not found."); 
     } 
} 

Я написал ExceptionMapper для этого исключения.

@Provider 
public class NotFoundExceptionMapper implements ExceptionMapper<NotFoundException> { 

public Response toResponse(NotFoundException ex) { 
    ErrorMesage errorMessage = new ErrorMessage(); 
    errorMessage.setCode(Status.NOT_FOUND.getStatusCode()); 
    errorMessage.setMessage(ex.getMessage()); 

    return Response.status(Status.NOT_FOUND) 
      .entity(errorMessage) 
      .type(MediaType.APPLICATION_JSON) 
      .build(); 
} 

}

Итак Когда я подам неизвестную папку ID в качестве параметра путь, исключение, но код в NotFoundExceptionMapper не вызывается. (Я вижу сообщение об ошибке в ответе, но как «обычный текст», хотя в mapper я возвращаю ответ в JSON, а точка отладки также не попадает).

Кроме того, Above exception mappingper вызывается при вводе неправильного имени ресурса в URI, но не для неправильного параметра пути.

Я также добавил блок отображения исключений, как показано ниже, чтобы ответить на все остальные исключения.

public class GenericExceptionMapper implements ExceptionMapper<Throwable>{ 

public Response toResponse(Throwable ex) { 
    ErrorMessage errorMessage = new ErrorMessage(); 
    errorMessage.setCode(Status.INTERNAL_SERVER_ERROR.getStatusCode()); 
    errorMessage.setMessage(ex.getMessage()); 


    return Response.status(errorMessage.getCode()) 
      .entity(errorMessage) 
      .type(MediaType.APPLICATION_JSON) 
      .build(); 
} 

Приведенный выше код вызывается всякий раз, когда любое исключение (кроме отображенных исключений) отбрасывается, и я получаю надлежащий ответ в формате JSON.

Так что же случилось с NotFoundException здесь? У меня есть об этом, и я также изучил источник NotFoundException, но не нашел ничего полезного, пожалуйста, помогите мне в этом.

+0

Как вы регистрируете эти исключения? –

+0

Не тестировались, но могут быть связаны с [this] (http://stackoverflow.com/q/29414041/2587435) ... Корреляция может быть найдена в [javavdoc] (https://jersey.java .net/apidocs/1.19/jersey/index.html? com/sun/jersey/api/NotFoundException.html) для NotFoundException, где сказано, что String arg является сущностью. –

+0

Я пробовал в обоих направлениях. 1. Добавление аннотации @Provider 2. Регистрация ресурса в классе приложения –

ответ

0

Похоже, вы не регистрируете свой класс отображения исключений с помощью JAX-RS. Попробуйте аннотацию @Provider с классом GenericExceptionMapper.