我是春季集成的新手。
我有一个流程,我需要根据某些条件执行 http 或 tcp 调用。我关注的问题与 http 调用有关。调用的其余端点需要一个 accessToken 作为用于身份验证的标头参数,该参数由具有 2 个方法getCurrentAccessToken()
和refreshAccessToken()
. 我只想在过期accessToken
时调用方法刷新。currentAccessToken
我想做的是在执行对rest api的调用时添加以下逻辑:
如果令牌已过期,其余端点将返回 401,我想在流程中拦截此错误并通过添加刷新的访问令牌重试请求。
@Bean
public IntegrationFlow clientIn(AbstractServerConnectionFactory server,
AbstractClientConnectionFactory client, LogService logService) {
return IntegrationFlows.from(Tcp.inboundAdapter(client)
.enrichHeaders(t -> t.headerFunction(IpHeaders.CONNECTION_ID, message -> this.client, true))
.log(msg -> "client: " + logService.log(msg))
.<byte[], Boolean>route(this::shouldForwardToHttp,
mapping -> mapping.subFlowMapping(true, sf -> sf
.enrichHeaders(t -> t.header("Content-Type", MimeTypeUtils.APPLICATION_JSON_VALUE))
.<byte[], RequestMessage>transform(this::buildRequestFromMessage)
.<RequestMessage, HttpEntity>transform(this::getHttpEntity)
.handle(Http.outboundGateway(restUrl).httpMethod(HttpMethod.POST)
.expectedResponseType(ResponseMessage.class))
.<ResponseMessage, byte[]>transform(p -> this.transformResponse(p))
.handle(Tcp.outboundAdapter(client))).subFlowMapping(false,
t -> t.handle(Tcp.outboundAdapter(server).retryInterval(1000))))
.get();
}
HttpEntity getHttpEntity(RequestMessage request) {
MultiValueMap<String, String> mv = new HttpHeaders();
mv.add("accessToken", tokenProvider.getCurrentAccessToken());
HttpEntity entity = new HttpEntity(request, mv);
return entity;
}
我尝试通过添加requestHandlerRetry
建议并将其重定向到 a recoveryChannel
,但我无法将某些内容返回给调用者流以获取带有状态代码的响应并使用新的accessToken
.
关于如何实现这一点的任何想法?