java - Spring Controller LoggingAspect不拦截方法

标签 java spring spring-boot

我有以下内容:

@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/

相关文章:

java - 使用 OData 接口(interface)开发 Spring REST 服务

java - 我想让 java 应用程序调用 ActionScript 中的函数?

java - 通过@RequestBody 加载的实体不会在 "saveOrUpdate"上持续删除其一对多关系中的项目

java - 使用 java 的 HTTP 补丁请求

java - 使用gradle在可执行jar生成中使用JSP进行Spring Boot

java - Spring Boot嵌入式tomcat将日志附加到每个tomcat请求

java - @Cacheable 带有 null 键

java - Spring MVC 可以在@RequestMapping 之后调用@ModelAttribute 吗?

java - Spring Async,如何在异步任务执行器中启用请求范围

java - JPA - JpaRepository 子记录具有父 ID 而不是实体记录,如果父记录已获取