从服务层到前端的java消息传递有哪些选项

从服务层到前端的java消息传递有哪些选项,java,spring-mvc,service-layer,Java,Spring Mvc,Service Layer,所以在我的服务层中,我有一些逻辑来做一些事情。有时,它必须先检查某件事情是否可行,然后再进行操作,或者只需从前端获得一些OK即可。您确定要这样做吗?这类东西。当然,前端会向屏幕发送一个事务以获取信息 在过去,我对此使用了运行时异常。我会投一个球 new MessageException("are.you.sure"); 然后控制器级别将执行以下操作: try{ theService.doSomething(); }catch(MessageException me) {

所以在我的服务层中,我有一些逻辑来做一些事情。有时,它必须先检查某件事情是否可行,然后再进行操作,或者只需从前端获得一些OK即可。您确定要这样做吗?这类东西。当然,前端会向屏幕发送一个事务以获取信息

在过去,我对此使用了运行时异常。我会投一个球

new MessageException("are.you.sure");
然后控制器级别将执行以下操作:

try{
        theService.doSomething();
    }catch(MessageException me) {
        model.addAttribute(me.getMessageKey());
        result.addError(new ObjectError());
    }
在另一个应用程序中,我创建了一个邮局对象,并在其中放置信件等信息。这是相当详细和非常好,但我的新应用程序是小得多,我不想要所有这些


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

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

我开始做的是让我的服务方法只抛出RuntimeException实例,并在@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注释的方法有一些规则,但非常可自定义。你可以在这里看到所有的可能性。你也应该看一看


就个人而言,我很少从服务层抛出已检查的异常。唯一经常出现的是IOException解析JSON,打开文件,甚至我喜欢用RuntimeException包装,因为在这个级别上我不能做任何特别的事情。

请注意:当异常是适当的,我并不是说它们在这种情况下是适当的时,您应该选择Check而不是runtime,尽管Spring的习惯不好,但每当异常指示某个情况是错误的,但在正常操作中可能偶尔会发生,也就是说,它不像NPE那样是错误的结果。@在@ControllerAdvice之前标记grea,您需要将@ExceptionHandler方法放在@Controller类中可以出现的地方。如果两个类中都可能发生异常,那么两个类都需要声明这样一个@ExceptionHandler。对不起,让我再问一个问题。所以你会用这个架构来做这样的事情,你确定吗?交互类型,而不仅仅是NullPointerException之类的?@markthegrea我不会用这个,你确定吗?因为这不会引发异常。我只会使用if-else,根据需要返回不同的页面。