【问题标题】:What are some options for java messaging from service layer to front end从服务层到前端的 java 消息传递有哪些选择
【发布时间】:2013-09-02 02:24:24
【问题描述】:

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

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

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

然后控制器层会做一个

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

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

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

【问题讨论】:

  • 就像一个注释:当异常是适当的(我并不是说在这种情况下),你应该更喜欢检查而不是运行时,尽管有不良的 Spring 习惯,只要异常表明一种情况是一个错误,但预计在正常操作中偶尔会发生(也就是说,它不是像 NPE 那样的错误的结果)。

标签: java spring-mvc service-layer


【解决方案1】:

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

我开始做的是让我的 Service 方法只抛出 RuntimeException 实例(与 @Transactional 一起工作)并在 @ControllerAdvice 注释类中定义我所有的 @ExceptionHandler 方法。比如:

@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包装,因为在那个级别我不能做任何特别的事情。

【讨论】:

  • @markthegrea 在@ControllerAdvice 之前,您需要将@ExceptionHandler 方法放在它们可以出现的@Controller 类中。如果两个类都可能发生异常,那么这两个类都需要声明这样一个@ExceptionHandler
  • 对不起,让我再问一个问题。因此,您会将此架构用于“您确定吗?”之类的事情。交互类型而不仅仅是 NullPointerExceptions 之类的?
  • @markthegrea 我不会将它用于Are you sure?,因为它不会引发异常。我只会使用if-else,根据情况返回不同的页面。
猜你喜欢
  • 2018-01-03
  • 2022-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-10
  • 1970-01-01
  • 2013-07-16
  • 1970-01-01
相关资源
最近更新 更多