接口实现改变了切入点解释

时间:2012-10-24 07:22:18

标签: spring spring-aop

我想在使用@Controller注释的类中选择所有使用@RequestMapping注释的方法。

以下切入点定义在某些情况下正常工作:

@within(org.springframework.stereotype.Controller)
    and
@annotation(org.springframework.web.bind.annotation.RequestMapping)

问题是,只要@Controller注释的类实现了某个接口,切入点就不再适用,并且方法不会被截获。当我刚刚实现java.io.Serializable。

时,甚至会发生这种情况

这例如不起作用,但只要我删除“ implements Serializable ”就可以了:

@Controller
public class TestController extends BaseController implements Serializable {
    @RequestMapping(value = "/test")
    public String testAuth1(final Model model) {
        return "test";
    }
}

Spring XML配置:

<aop:config>
    <aop:pointcut id="handlerMethods"
        expression="@within(org.springframework.stereotype.Controller) and @annotation(org.springframework.web.bind.annotation.RequestMapping)" />
    <aop:aspect ref="handlerAdvice">
        <aop:before method="interceptionMethod" pointcut-ref="handlerMethods" />
    </aop:aspect>
</aop:config>

有关于此的任何想法?谢谢!

1 个答案:

答案 0 :(得分:1)

BaseController是否实现了任何接口?

在您添加界面实现之前,似乎正在创建一个cglib代理,因此更简单的尝试解决方法是将proxy-target-class = "true"添加到<aop:config>

<aop:config proxy-target-class="true">
...
</aop:config>

如果你想使用JDK代理,你需要将注释移动到界面或spring mvc将不会看到它们。