我正在尝试使用 spring 集成定义错误流。在我进行 http 调用之前,我以自定义 header 的形式为我想要处理的资源设置了一个 id - 但是这会返回一个错误(不是 2xx http 代码),所以我正在定义 GenericTransform 类来取出错误并获取资源的 id(从 headeR 中提取)。但这似乎并没有像那样工作,我无法再访问在执行 HTTP 代码之前定义的自定义 header 。
如何实现?在下面的代码中,我可以添加自定义 header (messageId),但如果 http 调用返回了一个不成功的 http 代码,那么我将丢失 header 及其值 - 当调用 http 端点后成功响应时,这工作正常。
@Bean
public IntegrationFlow makeHttpCall() {
return message -> message
.enrich(e -> e
.requestPayload(Message::getPayload)
.shouldClonePayload(false)
.<Map<String, String>>headerFunction("messageId", m -> m.getPayload().substring(0,10), true)
)
.handle(makeHttpRequest())
.transform(new GenericTransformer<Message<ResponseEntity>, Message<ResponseEntity>>() {
@Override
public Message<ResponseEntity> transform(Message<ResponseEntity> message) {
if (message.getHeaders().get("http_statusCode").equals("http_statusCode=200")) {
//This is failing, only http headers available
logger.debug("Response from the endpoint: " + message.getPayload());
return message;
} else {
String messageId = message.getHeaders().get("messageId").toString();
MutableMessageHeaders headers = new MutableMessageHeaders(message.getHeaders());
headers.put("error_message", "1");
headers.put("messageId", messageId);
return new GenericMessage<ResponseEntity>(message.getPayload(), headers);
}
}
})
.channel("entrypoint");
}
高度赞赏任何想法。
最佳答案
这很好用,我的问题是因为我有一个变压器,它也是 modyfinig header ,但没有通过原始 header 。
.transform(new GenericTransformer<Message<String>, Message<String>>() {
@Override
public Message<String> transform(Message<String> message) { //incorrectly instantiated
MutableMessageHeaders headers = new MutableMessageHeaders();
headers.put("Content-Type", "application/json");
headers.put("Accept", "application/json");
Message<String> request = new GenericMessage<String>(json.toString(), headers);
return request;
}
})
所以第 3 行应该是:
MutableMessageHeaders headers = new MutableMessageHeaders(message.getHeaders());
谢谢!
关于java - 收到http错误后如何在Spring Integration中访问自定义 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38482418/