У меня есть несколько контроллеров для конечных точек RESTful, которые в настоящее время возвращают null
, если в конечной точке нет ресурсов. Например,Intercept null ResponseBody перед ответом сортировки
@RequestMapping(method = ReqeustMethod.GET, value = "{id}")
@ResponseBody
public MyResource get(@PathVariable final Long id) {
return this.myService.get(id); // returns null if bad id
}
Я хочу вернуть определенный, отличный ресурс для клиента (ErrorResource
), когда нет никакого MyResource
с заданным идентификатором. Я знаю, что могу сделать это с помощью отдельного метода с @ExceptionHandler
, такие как:
@RequestMapping(method = RequestMethod.GET, value = "{id}")
@ResponseBody
public MyResource get(@PathVariable final Long id) {
final MyResource myResource = this.myService.get(id);
if (myResource == null) {
throw new NotFoundException();
}
return myResource;
}
@ExceptionHandler(NotFoundException.class)
@ResponseStatus(value = HttpStatus.NOT_FOUND)
@ResponseBody
public ErrorResource notFoundException(
final HttpServletRequest request,
final NotFoundException exception) {
final ErrorResource errorResource = new ErrorResource();
errorResource.setStatus(HttpStatus.NOT_FOUND.value());
errorResource.setDeveloperMessage("No resource found at " + request.getRequestURL());
return errorResource;
}
И это хорошо. Но мне бы хотелось, чтобы у меня был какой-то перехватчик, который вычисляет для меня, что всякий раз, когда метод API возвращает null
@ResponseBody
, он должен вместо этого запустить логику в моем методе notFoundException()
. Это сделает все мои методы управления немного чище. Есть ли способ сделать это?
Я думаю, что вы ищете 'HandlerInterceptor'. – chrylis
@chrylis я посмотрел. 'preHandle()' слишком рано, 'postCompletion()' слишком поздно. 'postHandle()' дает мне «ModelAndView». Что мне делать с этим? Проверить значение null и выбросить исключение? Перепишите содержимое части 'Model'' ModelAndView'? –
Вы можете заставить сервис исключить исключение и придерживаться исключений (перемещение '@ ExceptionHandler' в классе базового контроллера) –