Java 控制器层中的AOP和异常问题

Java 控制器层中的AOP和异常问题,java,spring,controller,aop,Java,Spring,Controller,Aop,我们的应用程序具有以下层和交互: 查看(JSP)->Ajax调用->MyController(实现Spring控制器)->通过自定义服务查找->MyService(实现基本服务)->My DAOimpl 我们的想法是使用AOP记录异常。为了使AOP截取保持简单,我们决定在控制器上定义切割。控制器有几个方法,如onLoad、onUpdate(与CRUD ops相关),它们是从handleRequest方法调用的,我们想为poitncut定义这些方法。 即,服务层或服务层以下的任何异常都将冒泡并到达

我们的应用程序具有以下层和交互:

查看(JSP)->Ajax调用->MyController(实现Spring控制器)->通过自定义服务查找->MyService(实现基本服务)->My DAOimpl

我们的想法是使用AOP记录异常。为了使AOP截取保持简单,我们决定在控制器上定义切割。控制器有几个方法,如onLoad、onUpdate(与CRUD ops相关),它们是从handleRequest方法调用的,我们想为poitncut定义这些方法。 即,服务层或服务层以下的任何异常都将冒泡并到达控制器。AOP切入点定义为拦截抛出异常并将异常详细信息记录到日志中。随后,一个错误代码将被发送回视图,在该视图中将适当显示错误消息

问题: -AOP不会拦截对onLoad等方法的调用。我们理解这是因为HandlerRequest对这些方法的调用被视为控制器上的自调用,因此AOP不会拦截它们。 -为了避免上述问题,我们使用onLoad、onUpdate方法和一组实现onLoad等方法的util类创建了一个接口。控制器将这些UTIL作为成员。切入点将在这些UTIL而不是控制器上定义。执行此操作时,AOP仅在AOP配置存在于SpringServletXML中而不是AOP声明的自定义xml中时才起作用。此观察仅适用于控制器。如果AOP切割是在服务层上定义的,那么声明将按预期工作(在自定义xml中)。我们不确定SpringServletXML和控制器上的剪切之间的依赖关系

所需建议:
-我们应该为控制器定义AOP吗?这应该只在服务层定义吗?在控制器上,异常将被“捕获”,错误消息将被发送到适当的视图。希望检查原始方法中是否存在任何基本问题。

我们在产品中做了类似的事情,在服务层捕获异常并进行翻译。这种翻译有两个方面。其中一个当然与I18N有关。另一种翻译是确保产品中没有低级异常。相反,此类异常会转换为一般异常,从而防止异常泄漏

我认为在服务层捕获异常是一个很好的实践,因为这样可以使较低层免于异常处理(如果他们选择不这样做的话)。更重要的是,它让我们有机会做翻译和/或任何其他行动

谢谢,
Raghu

提示:如果使用real AspectJ AOP而不是Spring Proxy AOP,您甚至可以拦截来自同一实例的调用(
this.onLoad()
)。