java - 收到http错误后如何在Spring Integration中访问自定义 header

标签 java spring spring-integration dsl

我正在尝试使用 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/

相关文章:

java - 某些手机​​上的 Andengine 低 FPS

java - 是否可以从 bean 中获取 bean 方法的注解?

带有 Hive 连接的 Spring-boot-application 不会启动嵌入式 Tomcat

java - 使用 spring 在 IBM Websphere MQ 中实现重试逻辑

java - j2me : Works only for single digit operands 中的算术表达式求值

java - 更改EditText的下划线/样式......而不是链接,并水平滚动文本

spring - 有效解决 501 HTTPS Required Error in Maven Build for Moving (http ://repo1. maven.org/maven2 & http ://repo. spring.io) to HTTPS?

java - Spring批量并行处理

java - Delayer 与 Splitter 一起,消息不串行处理

jms - 如何在Spring集成中设置每个出站jms消息的优先级?