我们的应用程序具有以下层和交互:
View (JSP) -> Ajax calls -> MyController (implements Spring Controller) -> 通过自定义服务查找 -> MyService (implements Base Service) -> My DAOimpl
我们的想法是使用 AOP 来记录异常。为了保持 AOP 拦截简单,我们决定在控制器上定义切割。控制器有一些方法,如 onLoad、onUpdate(与 CRUD 操作相关),它们是从 handleRequest 方法调用的,我们想为 poitncut 定义这些方法。即,服务层或更低层的任何异常都会冒泡并到达控制器。AOP 切入点定义为拦截 throws 异常并将异常详细信息记录到日志中。随后,错误代码将被发送回正确显示错误消息的视图。
问题: - AOP 不拦截对 onLoad 等方法的调用。我们理解这是因为从handleRequest 对这些方法的调用被视为Controller 上的自调用,因此AOP 不会拦截它们。- 为了规避上述问题,我们创建了一个接口,其中包含 onLoad、onUpdate 方法和一组实现 onLoad 等方法的 util 类。控制器将这些实用程序作为成员。切入点将在这些工具而不是控制器上定义。执行此操作时,AOP 仅当 AOP 配置存在于 spring-servlet xml 中而不存在于用于 AOP 声明的自定义 xml 中时才有效。此观察仅适用于控制器。如果在服务层上定义了 AOP 切割,则声明按预期工作(在自定义 xml 中)。
需要的建议: - 我们是否应该为控制器定义 AOP?这应该只在服务层定义吗?在控制器上,异常将被“捕获”,错误消息将被发送到适当的查看。想检查原始方法中是否存在任何基本问题。