我正在使用Spring的AOP功能。我有课叫
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的原因是什么,所以它的出现应该是很有意义的。
发布于 2014-06-25 06:37:03
一个想法,如果可行的话,就是让BusinessException成为RuntimeException的一个子类,这更符合Spring哲学。
编辑:
您还询问了是否有办法在检查异常的情况下这样做。您可能采取的一种方法是基于对UserService合同的重新思考。“服务”(在Services意义上)通常是较高级别的域概念,因此实际上可能更适合从您的BusinessException契约中声明UserService。然后,当出现较低级别的持久性问题时,可以使用BusinessException (如果BusinessException意味着类似于“对业务服务的调用失败”之类的通用内容)包装,或者如果希望BusinessException具有狭义含义(例如,验证问题等等),则只声明BusinessException和PersistenceLayerException。
在这种情况下,您可能会使用UserService作为一个Security UserDetailsService,它实际上更面向持久性。如果是这样,那么上面的想法可能就不适用了。但如果不是这样的话,那是一种选择。
尽管如此,使BusinessException成为RuntimeException是与Spring实践最一致的,而且可以说是最好的实践,因为我描述了这里的原因。
发布于 2014-06-25 06:43:32
我可以想到一种方法(因为您说BusinessException是选中异常),用抛出的实际异常包装您的异常。如下图所示,并在来电者中适当处理。无论如何,在PersistenceException下包装业务异常是不可取的(感谢Wille指出它)
throw new PersistenceLayerException(new BusinessException(..));发布于 2015-10-22 09:37:47
我不熟悉Spring拦截器,但我相信它背后的逻辑将与标准的Java javax.interceptor.AroundInvoke完全相同
定义在业务方法上插入的拦截器方法.
AroundInvoke方法可以抛出其插入的方法的抛出子句所允许的任何异常。
因此,它说您的不应该抛出一个检查过的异常,这个异常不是由您正在用拦截器装饰的业务方法声明的。
实际上,不合并检查异常和AOP是很常见的做法。我认为使用AOP进行异常处理是使用检查异常的一种替代模式。
https://stackoverflow.com/questions/24401710
复制相似问题