【问题标题】:Spring AOP in controllers控制器中的 Spring AOP
【发布时间】:2015-06-04 18:41:08
【问题描述】:

我有一个 spring 项目,正在尝试在控制器中实现 AOP。

我在 applicationContext.xml 中添加了这些行:

<aop:aspectj-autoproxy/>
<bean id="homeController" class="package.domain.HomeController" />
<bean id="logAspect" class="package.aspect.LoggingAspect" />

我的方面类是这样的:

@Aspect
@Component
public class LoggingAspect {


    protected final Log logger = LogFactory.getLog(getClass());

    @Pointcut("execution( * package.web.HomeController.home(..) )")
    public void poincut() {
    }

    @Before("poincut()")
    public void before(){
        System.out.println("before");
    }

    @AfterReturning("poincut()")
    public void after(){
        System.out.println("after");
    }

    @AfterThrowing("poincut()")
    public void AfterThrowing(){
        System.out.println("AfterThrowing");
    }

}

我的控制器是这样的:

@RequestMapping(value = "/home.htm")
    public ModelAndView home(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {

        ....

        return new ModelAndView("home", "model", model);
    }

大家都喜欢,没有错误,这条消息:

DEBUG: org.springframework.aop.aspectj.annotation.ReflectiveAspectJAdvisorFactory - Found AspectJ method: public void package.aspect.LoggingAspect.before()
DEBUG: org.springframework.aop.aspectj.annotation.ReflectiveAspectJAdvisorFactory - Found AspectJ method: public void package.aspect.LoggingAspect.after()
DEBUG: org.springframework.aop.aspectj.annotation.ReflectiveAspectJAdvisorFactory - Found AspectJ method: public void package.aspect.LoggingAspect.AfterThrowing()

如果更改我的切入点并使用下一行它可以工作,但是当我选择控制器时失败:

@Pointcut("execution( * *(..) )")

谢谢!!

【问题讨论】:

  • 您遇到什么错误?粘贴痕迹。顺便说一句,那个切入点太宽泛了,你应该考虑限制它
  • 你的包真的是以package开头的吗?
  • 不,是我的客户端包,com.client.project。
  • 请显示完整的控制器类包括顶部的包声明,对于方面也是如此。如果它与通用切入点一起使用,那么您在切入点中的包名称使用方面犯了一个错误。

标签: java spring spring-mvc model-view-controller aop


【解决方案1】:

如果它适合你,那么选择:

@Pointcut("execution( * *(..) )")

并通过在同一方面中的附加切入点将您的方面限制为您的控制器:

@Pointcut("within(@package.web.HomeController *)")
public void controllerBean() {}

【讨论】:

    猜你喜欢
    • 2017-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-19
    • 1970-01-01
    相关资源
    最近更新 更多