所以在我的服务层,我有一些逻辑做一些事情。有时它必须先检查一下是否有可能在它之前完成它或者只需从前端得到一些好的("你确定要这样做吗?"有点东西)。当然,前端会向屏幕发送一个交易以获取信息。
过去我使用过RuntimeExceptions。我会抛出一个
new MessageException("are.you.sure");
然后控制器级别将执行
try{
theService.doSomething();
}catch(MessageException me) {
model.addAttribute(me.getMessageKey());
result.addError(new ObjectError());
}
在另一个应用程序中,我创建了一个PostOffice对象,并在其中添加了字母等消息。这是非常复杂和非常好,但我的新应用程序要小得多,我不想要这一切。
所以我正在寻找一些最佳实践。你们如何从服务层向前端发送消息?请记住,我不是在谈论例外!我只是谈论来自服务层的消息。
答案 0 :(得分:0)
关于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
包裹,因为它不像我在那个级别可以做任何特殊的事情。< / p>