我通过以下这些更改和@M.Deinum 评论解决了这个问题:
public class ThreadContextHolder {
private ThreadContextHolder() {
}
private static final ThreadLocal<Map<String, Object>> ctx = new ThreadLocal<>();
public static Map<String, Object> getContext() {
return ctx.get();
}
public static void setContext(Map<String, Object> attrs) {
ctx.set(attrs);
}
public static void removeContext() {
ctx.remove();
}
}
然后注入taskExecutor
to ApiCallLogAspect
class:
@Bean
public Executor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setTaskDecorator(
runnable -> {
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
Map<String, Object> headers = new HashMap<>();
for (String header : Collections.list(request.getHeaderNames())) {
headers.put(header, request.getHeader(header));
}
return () -> {
try {
ThreadContextHolder.setContext(headers);
runnable.run();
} finally {
ThreadContextHolder.removeContext();
}
};
});
executor.initialize();
return executor;
}
然后改变endpointAfterReturning
方法:
@Async
@AfterReturning(value = ("within(com.example..*.web.rest.api..*)"), returning = "returnValue")
public void endpointAfterReturning(JoinPoint p, Object returnValue) throws InterruptedException {
Map<String, String> headers = new HashMap<>();
ThreadContextHolder.getContext().forEach((s, o) -> headers.put(s, o.toString()));
System.out.println(headers.get("authorization"));
}
现在,一切正常。如果此解决方案有问题,请通知我。