Ведение весеннего MVC - PullRequest
       4

Ведение весеннего MVC

0 голосов
/ 07 марта 2012

В настоящее время я работаю над веб-приложением, использующим Spring MVC, и использую аннотацию @ExceptionHandler во всех контроллерах приложения.

Итак, я получил такой метод:

@ExceptionHandler(RuntimeException.class)
public String handleException(RuntimeException ex) {
    injectedService.notifyAndLogException(ex.getMessage());
    return ("error_page");
}

Моя идея состоит в том, чтобы войти и отправить электронное письмо администратору приложения во внедренном сервисе. На данный момент я попытался прочитать некоторую документацию о входе в систему в приложении Spring, и все, что я видел, это установка статического регистратора в каждом контроллере.

Как это:

 private final Logger log = LoggerFactory.getLogger(Controller.class);

@ExceptionHandler(RuntimeException.class)
public String handleException(RuntimeException ex) {
    log.info("Logging error");
    injectedService.notifyException(ex.getMessage());
    return ("error_page");
}

Я хотел бы знать, какой смысл использовать регистратор на каждом контроллере, а не использовать его только в одной точке (услуга)?

Ответы [ 3 ]

4 голосов
/ 07 марта 2012

Я хотел бы знать, какой смысл использовать регистратор на каждом контроллере, а не использовать его только в одной точке

Если вы используете один регистратор для всего приложения, тогда каждое сообщение журнала будет зарегистрировано как прибывающее от того же самого компонента.Используя регистратор для каждого класса или компонента, ваши файлы журнала будут содержать информацию о , который компонент записал в журнал.

Например, когда вы делаете:

Logger log = LoggerFactory.getLogger(Controller.class);

Создает регистратор с именем класса Controller, который обычно будет отображаться в файле журнала, например,

2012-03-07:12:59:00 com.x.y.Controller Hello!

Это просто соглашение, но я советую вам соблюдать его.

1 голос
/ 08 марта 2012

регистратор в каждом из ваших файлов классов позволяет получить уровень «отладки» или «информации», когда вы работаете или не можете подключиться к отладчику.

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

С помощью регистратора в классе, получившем исключение, вы сможете получить переменные класса, которые не передаются в ваш обработчик исключений..

Я также рекомендовал бы, чтобы вы не делали

injectedService.notifyAndLogException(ex.getMessage());

, но передавали исключение в свое уведомление.Хотя трассировка стека может быть печально известной, сообщения обычно не очень полны справки (NullPointerException без трассировки стека?).В вашем сервисе уведомлений вы можете установить тему ex.getMessage (), и тело будет иметь трассировку всего стека.

0 голосов
/ 07 марта 2012

Ваши контроллеры могут расширять абстрактный класс, который объявляет регистратор, подобный этому

 protected Logger logger = LoggerFactory.getLogger( getClass() );

Этот регистратор может использоваться во всех контроллерах, и он префикс сообщения журнала с именем класса контроллера.

...