Какие есть варианты для обмена сообщениями 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 потому что я не могу сделать что-то особенное на этом уровне.

Другие вопросы по тегам