对不起,我错过了这个问题。
问题是 ETag 标头。
这是我向服务器发出 curl 请求时的标头响应。
Content-Length: 228
Content-Type: application/json
X-ORACLE-DMS-ECID: 644f1021-bee9-4a11-b8ab-ab8557a746c0-00000f2c
ETag: 1
X-ORACLE-DMS-RID: 0
这是堆栈跟踪:
java.lang.IllegalArgumentException: Invalid ETag: does not start with W/ or "
at org.springframework.util.Assert.isTrue(Assert.java:121) ~[spring-core-5.3.9.jar:5.3.9]
at org.springframework.http.HttpHeaders.setETag(HttpHeaders.java:1039) ~[spring-web-5.3.9.jar:5.3.9]
at org.springframework.integration.http.support.DefaultHttpHeaderMapper.setETag(DefaultHttpHeaderMapper.java:588) ~[spring-integration-http-5.5.2.jar:5.5.2]
at org.springframework.integration.http.support.DefaultHttpHeaderMapper.setHttpHeader(DefaultHttpHeaderMapper.java:406) ~[spring-integration-http-5.5.2.jar:5.5.2]
at org.springframework.integration.http.support.DefaultHttpHeaderMapper.fromHeaders(DefaultHttpHeaderMapper.java:377) ~[spring-integration-http-5.5.2.jar:5.5.2]
at org.springframework.integration.http.support.DefaultHttpHeaderMapper.fromHeaders(DefaultHttpHeaderMapper.java:75) ~[spring-integration-http-5.5.2.jar:5.5.2]
at org.springframework.integration.http.inbound.HttpRequestHandlingEndpointSupport.setupResponseAndConvertReply(HttpRequestHandlingEndpointSupport.java:427) ~[spring-integration-http-5.5.2.jar:5.5.2]
at org.springframework.integration.http.inbound.HttpRequestHandlingMessagingGateway.handleRequest(HttpRequestHandlingMessagingGateway.java:114) ~[spring-integration-http-5.5.2.jar:5.5.2]
at org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:52) ~[spring-webmvc-5.3.9.jar:5.3.9]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1064) ~[spring-webmvc-5.3.9.jar:5.3.9]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963) ~[spring-webmvc-5.3.9.jar:5.3.9]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.9.jar:5.3.9]
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) ~[spring-webmvc-5.3.9.jar:5.3.9]
这是我的示例代码,如果远程服务器以标头 ETag: 1 引发异常,则在将消息发送到通道“request.input”时激活服务。
@Value("${auth.token}")
private String authToken;
@Value("${auth.key}")
private String authKey;
@Value("${url}")
private String url;
@Bean
public IntegrationFlow outRequest() {
return IntegrationFlows.from(Http.inboundGateway("/request")
.requestMapping(m-> m.methods(HttpMethod.POST))
.requestPayloadType(RequestPayloadDTO.class).errorChannel("errorChannel"))
.transform(requestTransformer)
.gateway("request.input")
.get();
}
@Bean
public IntegrationFlow request() {
return flow -> flow.enrichHeaders((headerEnricherSpec -> {
headerEnricherSpec.header(authKey,authToken,true);
})).handle(Http.outboundGateway(url)
.mappedRequestHeaders(authKey)
.httpMethod(HttpMethod.POST)
.expectedResponseType(ResponseDTO.class)
).transform(responseTransformer);
}
@MessagingGateway(defaultRequestChannel = "request.input")
public interface RequestGateway {
ResponseDTO exchange(String out);
}