我现在有一个SpringBoot项目,里面已经设置了很多获取时间的业务代码,比如LocalDate.now(),LocalDateTime.now(),new Date(),new DateTime()... .. 我现在想为每个请求设置一个时区,以便业务代码根据时区执行时间获取,但我不想更改业务代码,因为它太多了!
尝试使用AspectJ拦截静态方法,但发现只能拦截自己定义的静态方法,不能拦截LocalDateTime等JDK包的静态方法
@Aspect
@Component
@Slf4j
public class ControllerAspect {
@Pointcut("execution(* com.pkslow.springboot.controller..*.*(..))")
private void testControllerPointcut() {
}
@Pointcut("execution(* java.time.LocalDateTime.now())")
private void testControllerPointcut1() {
}
@Around("testControllerPointcut1()")
public Object etst1(ProceedingJoinPoint pjp) throws Throwable {
log.info("request");
return LocalDateTime.now(ZoneId.of("America/Chicago"));
}
}
@RestController
@RequestMapping("/test")
@Slf4j
public class TestController {
private final TestService testService;
public TestController(TestService testService) {
this.testService = testService;
}
@GetMapping("/hello")
public String hello() {
System.out.println(LocalDateTime.now());
return "Hello, pkslow.";
}
}
我无法使用 AspectJ 拦截对 JDK 类的调用
您需要从基于代理的Spring AOP切换到本机AspectJ。请记住从您的本机 AspectJ 方面删除
@Component
。然后,从 execution(..)
切换到 call(..)
切入点,以便编织到调用站点而不是被调用的方法中。就像你说的,被调用的方法在 JDK 中,因此无法用于编织。