Какие есть варианты для обмена сообщениями Java от сервисного уровня до внешнего интерфейса?
Так что в моем слое Service у меня есть некоторая логика, которая делает некоторые вещи. Иногда он должен проверить, возможно ли что-то, прежде чем он это сделает, ИЛИ просто должен получить некоторое одобрение от внешнего интерфейса ("Вы уверены, что хотите это сделать?"). Внешний интерфейс, конечно, отправляет транзакцию на экран, чтобы получить информацию.
В прошлом я использовал RuntimeExceptions для этого. Я брошу
new MessageException("are.you.sure");
а затем уровень контроллера будет делать
try{
theService.doSomething();
}catch(MessageException me) {
model.addAttribute(me.getMessageKey());
result.addError(new ObjectError());
}
В другом приложении я создал объект PostOffice и помещал в него буквы и тому подобное для сообщений. Это было довольно сложно и очень приятно, но мое новое приложение намного меньше, и я не хочу всего этого.
Поэтому я ищу несколько лучших практик. Как вы, ребята, отправляете сообщения из сервисного уровня во внешний интерфейс? И имейте в виду, я не говорю об исключениях! Я просто говорю о сообщениях из сервисного уровня.
1 ответ
Одна из замечательных особенностей Spring MVC - обработка исключений. Так как DispatcherServlet
имеет try-catch(Exception)
Оборачивая метод-обработчик (т. е. метод вашего контроллера), он может перехватывать все сгенерированные исключения и обрабатывать их @ExceptionHandler
методы или какая-то другая конструкция (есть альтернативы).
Я начал делать только то, что мои методы обслуживания RuntimeException
экземпляры (хорошо работает с @Transactional
) и определить все мои @ExceptionHandler
методы в @ControllerAdvice
аннотированный класс. Что-то вроде:
@ControllerAdvice
public class ControllerHandler {
private static final Logger logger = LoggerFactory.getLogger(ControllerHandler.class);
@ExceptionHandler(value = AuthenticationException.class)
public String handleAuthenticationException(AuthenticationException e) {
if (logger.isInfoEnabled()) {
logger.info("An AuthenticationException occurred: {}", e.getMessage());
}
return "redirect:/";
}
...more
}
@ExceptionHandler
Аннотированные методы имеют несколько правил, но они очень настраиваемы. Вы можете увидеть все возможности в Javadoc здесь. Вы также должны взглянуть на ResponseStatus
,
Лично я редко выбрасываю проверенные исключения из моего сервисного уровня. Единственное, что часто появляется IOException
(разбор JSON, открытие файлов) и даже то, что мне нравится оборачивать в RuntimeException
потому что я не могу сделать что-то особенное на этом уровне.