Я использую трикотаж для веб-служб REST.
Я обрабатываю все 404 ответа, выбрасывая NotFoundException (Package com.sun.jersey.api) всякий раз, когда я не получаю какой-либо объект из уровня обслуживания.
e.g.
@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();
}
}
Поэтому, когда я указываю неизвестный идентификатор папки в качестве параметра пути, возникает исключение, но код NotFoundExceptionMapper не вызывается. (Я вижу сообщение об исключении в ответе, но как «обычный текст», хотя в картографе я возвращаю ответ в JSON; и точка останова отладки также не срабатывает).
Кроме того, вышеупомянутое сопоставление исключений вызывается, когда я ввожу неправильное имя ресурса в 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, но не нашел ничего полезного, пожалуйста, помогите мне в этом.
RuntimeException
, а затем несколькоinstanceof
внутри для таких случаев, как 404. Все остальные исключения (не охваченныеinstanceof
) привели к 500. - person Jaroslaw Pawlak   schedule 16.11.2015