Упростить отлов исключений в контроллерах - PullRequest
3 голосов
/ 12 ноября 2011

Я делаю веб-сервис, используя Spring MVC.Контроллеры вызываются пользователем напрямую (через сервлет despatcher), а ответ возвращается в виде JSON.Я думаю, что использование контроллеров с помощью аннотаций очень удобно, но я нахожу довольно скучное исключение для каждого контроллера.Исключения всегда одинаковы, а также ответ для каждого исключения одинаков, так что я могу определить, как перехватить их только один раз вместо каждого контроллера?Я думал о чем-то вроде фильтра, но, может быть, это не очень хорошая идея ... Любой намек?

Теперь мои контроллеры выглядят так:

@Controller
@RequestMapping("/do")
@PreAuthorize("hasRole('ROLE_USER')") 
public class UselessController {

@SuppressWarnings("rawtypes")
@RequestMapping(value = "/foo", method = RequestMethod.GET)
@PreAuthorize("#bar == principal.bar")
public ResponseEntity foo(@RequestParam int bar) {

    try {
        //do something
    } catch (SomeTypeOfException stExc) {
        return new ResponseEntity(HttpStatus.FORBIDDEN);
    } catch (NoResultException nrExc) {
        return new ResponseEntity(HttpStatus.PRECONDITION_FAILED);
    } catch (Exception exc) {
        return new ResponseEntity(HttpStatus.METHOD_FAILURE);
    }

    return new ResponseEntity(HttpStatus.OK);
}

1 Ответ

4 голосов
/ 13 ноября 2011

То, что вы ищете, это HandlerExceptionResolver .Если все, что вам нужно, это просто простой распознаватель для большинства распространенных исключений, реализуйте интерфейс (есть также несколько готовых реализаций, см. «Все известные классы реализации» в документе) и аннотируйте его как компонент, чтобы он был выбран при запускевремя работы (по крайней мере, я не помню, чтобы мне приходилось «регистрировать» его отдельно или что-то в этом роде).Если вам нужен более детальный элемент управления, вы можете сделать это с помощью кода в своем собственном HandlerExceptionResolver или создать SimpleMappingExceptionResolver для сопоставления различных исключений с их собственными представлениями ошибок, что обычно выполняется через xml-конфиги.

...