1

所以在我的服务层中,我有一些逻辑可以做一些事情。有时它必须在它执行之前检查是否有可能,或者它只需要从前端得到一些确定(“你确定要这样做吗?”之类的东西)。当然,前端会向屏幕发送交易以获取信息。

过去我为此使用过 RuntimeExceptions。我会扔一个

new MessageException("are.you.sure");

然后控制器级别将执行

try{
        theService.doSomething();
    }catch(MessageException me) {
        model.addAttribute(me.getMessageKey());
        result.addError(new ObjectError());
    }

在另一个应用程序中,我创建了一个 PostOffice 对象,并将信件等放入其中用于消息。它非常精致且非常好,但我的新应用程序要小得多,我不想要所有这些。

所以我正在寻找一些最佳实践。你们如何将消息从服​​务层发送到前端?请记住,我不是在谈论例外!我只是在谈论来自服务层的消息。

4

1 回答 1

0

Spring MVC 的一大优点是异常处理。由于DispatcherServlet有一个try-catch(Exception)包装处理程序方法(即您的控制器方法),它可以捕获所有抛出的异常并使用@ExceptionHandler方法或其他构造处理它们(有替代方法)。

我开始做的是让我的 Service 方法只抛出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.

于 2013-08-29T15:10:13.113 回答