AspectJ 自动代理与 Spring 控制器和 Webflow 操作的问题



我有两个关于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";
    }
    ...
}

这里的问题是,由于控制器实现的接口没有定义其所有公共方法(即控制器请求映射方法),因此为控制器创建了一个代理,该代理仅代理来自 Outoutstanding Interface 的"doSomethingOutoutstanding "方法。因此,当请求进入/amazingUrl.htm 时,Spring 不会将其路由到适当的请求处理程序 - 就好像请求映射不存在一样。我已经通过为控制器定义一个接口来解决这个问题,该接口扩展了 Outoutstanding Interface,并定义了控制器所需的请求处理程序方法,但对我来说,必须为控制器定义一个接口似乎很奇怪/错误,以便 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问题,而不必为我想建议的每个类定义接口?

您应该在类路径中添加 CGLIB 依赖项,这样就不需要创建用于使用 AOP 的接口

看看文档。

最新更新