SpringBoot项目如何为每个请求设置时区

问题描述 投票:0回答:1

我现在有一个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 类的调用

java aspectj
1个回答
0
投票

您需要从基于代理的Spring AOP切换到本机AspectJ。请记住从您的本机 AspectJ 方面删除

@Component
。然后,从
execution(..)
切换到
call(..)
切入点,以便编织到调用站点而不是被调用的方法中。就像你说的,被调用的方法在 JDK 中,因此无法用于编织。

© www.soinside.com 2019 - 2024. All rights reserved.