3

我有两个关于 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 问题,而不必为我想要建议的每个类定义接口?

4

1 回答 1

1

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

看看文档

于 2012-07-03T15:41:45.193 回答