如何在收到http错误后访问Spring Integration中的自定义标头

时间:2016-07-20 13:16:56

标签: java spring spring-integration dsl

我正在尝试使用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");
}

任何想法都高度赞赏。

1 个答案:

答案 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());

谢谢!