【问题标题】:interface implementation changes pointcut interpretation接口实现变更切入点解读
【发布时间】:2012-10-24 16:23:54
【问题描述】:

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

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

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

问题是,一旦@Controller-annotated 类实现了某个接口,切入点就不再适用,并且方法不会被拦截。当我刚刚实现 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>

对此有什么想法吗?谢谢!

【问题讨论】:

    标签: spring spring-aop


    【解决方案1】:

    BaseController 是否实现了任何接口?

    在添加接口实现之前,您似乎正在创建一个 cglib 代理,因此更简单的解决方法是将 proxy-target-class = "true" 添加到 &lt;aop:config&gt;

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

    如果你想使用 JDK 代理,你需要将注解移到接口上,否则 spring mvc 将看不到它们。

    【讨论】:

    • 不知道有办法强制执行 CGLIB。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-03
    • 1970-01-01
    • 2012-10-11
    • 2016-01-15
    • 2018-08-16
    • 2013-01-29
    相关资源
    最近更新 更多