我有以下内容:
@Pointcut("execution(*com.shop.controller.OrderController.save(..))")
public void savingOrder() {
log.info("Saving order details");
}
@Before("savingOrder() && args(..,request)")
public void logSavingOrder(JoinPoint joinPoint, HttpServletRequest request){
log.info("Saving");
}
但是,日志永远不会显示。
当我尝试以下操作时:
@Pointcut("execution(* com.shop.controller.OrderController.saveOrder(..))")
public void savingOrder() {
log.info("Saving order details");/**/
}
@Before("savingOrder()")
public void logSavingOrder(JoinPoint joinPoint){
log.info("Saving order");
}
一切正常。但是,我需要访问 HttpServletRequest
。
关于我做错了什么有什么想法吗?
最佳答案
不要将其添加到拦截方法的方法签名中,请使用以下方法之一在拦截方法内部访问它:
如果 bean 是请求范围的,您可以 Autowiring HttpServletRequest,如下所示:
@Component
@Scope("request")
public class Foo {
@Autowired private HttpServletRequest request;
//
}
否则您可以按如下方式获取当前请求:
ServletRequestAttributes sra = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
HttpServletRequest req = sra.getRequest();
这在幕后使用了线程局部。
如果您使用 Spring MVC,这就是您所需要的。如果您没有使用 Spring MVC,那么您需要在 web.xml 中注册 RequestContextListener 或 RequestContextFilter。
关于java - Spring Controller LoggingAspect不拦截方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40129744/