基于拦截 HTTP 请求的,日志记录与重试补偿的工具。
@Resource private RestTemplate restTemplate; // 普通 RestTemplate 请求 String result = restTemplate.exchange("url", HttpMethod.GET, null, String.class); // 使用 LogContext 包装后的 RestTemplate 请求 String result2 = LogContext.log().execute(() -> { return restTemplate.exchange("url", HttpMethod.GET, null, String.class); });
// log() => retry() 以后,就会生成重试任务 String result = LogContext.retry().execute(() -> { return restTemplate.exchange("url", HttpMethod.GET, null, String.class); });
1 heyleo 2022-09-26 10:58:20 +08:00 取了 request 的流之后,后面还能正常使用吗,可以分别试下 application/json 和 application/x-www-form-urlencoded 的流,在 controller 层还能正确取到参数吗 |
![]() | 2 wolfie OP @heyleo 你说的应该是 ServletRequest 场景。 这里有判断,最外层的 ServletRequestWrapper 必须为可重复读取,不然不会读 Request Body https://github.com/wolfiesonfire/request-log/blob/master/request-log-core/src/main/java/com/wolfie/log/context/request/ServletRequestContext.java#L148~L150 |
3 heyleo 2022-09-26 11:18:54 +08:00 @wolfie 嗯嗯,是这个,我现在也是这样写的,针对 application/json 的流可以正常使用,但是针对 application/x-www-form-urlencoded 的流,controller 层拿到参数之后都为空 |
![]() | 4 KevinBlandy 2022-09-26 12:35:23 +08:00 |
![]() | 5 wolfie OP @heyleo spring-boot-demo 里是可以拿到 form-post 里的 body 。 demo 里在 Filter 有对 ServletRequestWrapper 进行可重复读的包装。 https://github.com/wolfiesonfire/request-log/blob/master/request-log-spring-boot-demo/src/main/java/com/wolfie/demo/aop/ContentCachingRequestFilter.java#L22 |