0

对不起,我错过了这个问题。

问题是 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);
}


4

1 回答 1

1

我已经通过添加解决了

.transform(responseTransformer).headerFilter("ETag");

谢谢你。

于 2021-08-20T06:19:26.567 回答