0

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

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?这应该只在服务层定义吗?在控制器上,异常将被“捕获”,错误消息将被发送到适当的查看。想检查原始方法中是否存在任何基本问题。

4

1 回答 1

0

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

我认为在服务层捕获异常是一种很好的做法,因为这样可以使较低层免于异常处理(如果他们选择不这样做)。此外,它让我们有机会进行翻译和/或任何其他操作。

谢谢,拉古

于 2012-11-27T21:09:58.410 回答