我有两个关于 spring/AspectJ AOP 的相关问题。我有一个典型的记录器方面,它记录从我的应用程序中的任何类抛出的异常,包括服务、daos、控制器和 webflow 操作......
@Aspect
public class AspectLogger {
@AfterThrowing(pointcut = "execution(* com.myapp..*.*(..))", throwing = "t")
public void logGustavoException(JoinPoint joinPoint, Throwable t) {
Log logger = LogFactory.getLog(joinPoint.getTarget().getClass());
logger.error(t.getMessage(), t);
}
}
在我的应用程序上下文中,我有一个同样典型的配置......
<context:annotation-config />
<!-- AOP logging config -->
<aop:aspectj-autoproxy>
<aop:include name="aspectLogger" />
</aop:aspectj-autoproxy>
<bean id="aspectLogger" class="com.myapp.AspectLogger" />
这在大多数情况下都很好,我遇到的问题是实现接口的 webflow 操作和控制器。
1 - 实现接口的控制器......
我们的一个控制器实现了一个接口,该接口定义了一个方法,并定义了几个用作@RequestMapping 处理程序的公共方法......
@Controller
public class AmazingController implements OutstandingInterface {
// implements the method from OutstandingInterface
@Override
public Object doSomethingOutstanding(){
...
}
@RequestMapping(value="/amazingUrl.htm", method = RequestMethod.GET)
public String doSomethingAmazing(HttpSession session, ModelMap model) {
return "anAmazingViewName";
}
...
}
这里的问题是,由于控制器实现了一个没有定义其所有公共方法的接口(即控制器请求映射方法),因此为控制器创建了一个代理,该代理仅代理来自OutstandingInterface 的“doSomethingOutstanding”方法。因此,当请求进入 /amazingUrl.htm 时,Spring 不会将其路由到适当的请求处理程序 - 就好像请求映射不存在一样。我已经通过为控制器定义一个接口来解决这个问题,该接口扩展了OutstandingInterface,并且还定义了控制器所需的请求处理程序方法,但对我来说,必须为控制器定义一个接口以便AspectJ的东西不'不'隐藏'请求处理程序......
@Controller
public interface IAmazingController extends OutstandingInterface{
@RequestMapping(value="/amazingUrl.htm", method = RequestMethod.GET)
public String doSomethingAmazing(HttpSession session, ModelMap model);
}
...
public class AmazingController implements IAmazingController {
@Override
public Object doSomethingOutstanding(){
...
}
@Override
@RequestMapping(value="/amazingUrl.htm", method = RequestMethod.GET)
public String doSomethingAmazing(HttpSession session, ModelMap model) {
return "anAmazingViewName";
}
...
}
2 - 网络流操作
第二个问题非常相似。引入 AspectJ 配置后,我的 webflow Action 类都没有被正确地自动装配——我不断收到“找不到 FantasticAction 类型的 bean”之类的错误。同样,我为所有 Action 类引入了接口,这解决了问题,因为它是在运行时注入的代理,而不是实际的操作实现类。
所以最后......这两种情况下的问题是 - 有没有一种方法可以解决这些 AspectJ 问题,而不必为我想要建议的每个类定义接口?