首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >拦截器Java和检查异常

拦截器Java和检查异常
EN

Stack Overflow用户
提问于 2014-06-25 06:30:45
回答 3查看 2.1K关注 0票数 2

我正在使用Spring的AOP功能。我有课叫

代码语言:javascript
复制
class UserService {
    public User insertUserService(User user) throws PersistenceLayerException {
        System.out.println("UserServiceImpl_Two called: insertUserService method");

        if (user.id == 1) 
            throw new PersistenceLayerException();

        return null;
    }
}

现在,对此方法insertUserService的调用被一个拦截器拦截,该拦截器进行一些验证。此验证拦截器引发一个名为BusinessException的检查异常。现在,当抛出此异常时,Java抛出一个UndeclaredThrowableException,因为BusinessExcepetion没有在insertUserService抛出中声明。有没有一种方法可以绕过这个UndeclaredThrowableException,而不必在抛出子句中声明BusinessException

insertUserService本身没有抛出一个BusinessException的原因是什么,所以它的出现应该是很有意义的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-06-25 06:37:03

一个想法,如果可行的话,就是让BusinessException成为RuntimeException的一个子类,这更符合Spring哲学。

编辑:

您还询问了是否有办法在检查异常的情况下这样做。您可能采取的一种方法是基于对UserService合同的重新思考。“服务”(在Services意义上)通常是较高级别的域概念,因此实际上可能更适合从您的BusinessException契约中声明UserService。然后,当出现较低级别的持久性问题时,可以使用BusinessException (如果BusinessException意味着类似于“对业务服务的调用失败”之类的通用内容)包装,或者如果希望BusinessException具有狭义含义(例如,验证问题等等),则只声明BusinessExceptionPersistenceLayerException

在这种情况下,您可能会使用UserService作为一个Security UserDetailsService,它实际上更面向持久性。如果是这样,那么上面的想法可能就不适用了。但如果不是这样的话,那是一种选择。

尽管如此,使BusinessException成为RuntimeException是与Spring实践最一致的,而且可以说是最好的实践,因为我描述了这里的原因。

票数 1
EN

Stack Overflow用户

发布于 2014-06-25 06:43:32

我可以想到一种方法(因为您说BusinessException是选中异常),用抛出的实际异常包装您的异常。如下图所示,并在来电者中适当处理。无论如何,在PersistenceException下包装业务异常是不可取的(感谢Wille指出它)

代码语言:javascript
复制
throw new PersistenceLayerException(new BusinessException(..));
票数 1
EN

Stack Overflow用户

发布于 2015-10-22 09:37:47

我不熟悉Spring拦截器,但我相信它背后的逻辑将与标准的Java javax.interceptor.AroundInvoke完全相同

定义在业务方法上插入的拦截器方法.AroundInvoke方法可以抛出其插入的方法的抛出子句所允许的任何异常

因此,它说您的不应该抛出一个检查过的异常,这个异常不是由您正在用拦截器装饰的业务方法声明的。

实际上,不合并检查异常和AOP是很常见的做法。我认为使用AOP进行异常处理是使用检查异常的一种替代模式。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24401710

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档