我正在尝试使用spring集成定义错误流。在我进行http调用之前,我正在以我想要处理的资源的自定义标头的形式设置id - 但是这会返回错误(不是2xx http代码),所以我定义了GenericTransform类来取出错误并获取资源的id(从headeR中提取)。但是这似乎并没有像这样工作,我不再能够访问在执行HTTP代码之前定义的自定义标头。
如何实现这一目标?在下面的代码中,我能够添加自定义标头(messageId),但是如果http调用返回了不成功的http代码,那么我将丢失标头及其值 - 当调用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");
}
任何想法都高度赞赏。
答案 0 :(得分:0)
这很好用,我的问题是因为我有一个变压器,它也是modyfinig标题而没有通过原始的。
.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());
谢谢!