2015-11-25 78 views
0

我正在使用最新的Spring Integration 4.2.1.RELEASE,使用DSL配置。我的请求没有从入站请求映射的HTTP Header Content-type。Spring集成4.2.1.RELEASE内容类型头文件未映射

已经解决了旧的JIRA INT-3508。在4.0 to 4.1 migration guide,似乎说这是固定的。

但是我的代码没有请求头。

@Bean 
public IntegrationFlow httpProxyFlow() { 
    return IntegrationFlows 
     .from((MessagingGateways g) -> 
       g.httpGateway("/csa-service/**") 
        .messageConverters(getMessageConverter()) 
        .payloadFunction(httpEntity -> 
          ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()) 
            .getRequest() 
            .getQueryString()) 
        .requestPayloadType(String.class)) 
        .handleWithAdapter(a -> 
          a.httpGateway(this::setupUrl) 
            .messageConverters(getMessageConverter()) 
            .httpMethodFunction(this::getMethodFunction) 
            .errorHandler(new PassThroughErrorHandler()) 
            .encodeUri(false) 
            .expectedResponseType(String.class) 
        ).get(); 
} 

private HttpMessageConverter getMessageConverter() { 
    StringHttpMessageConverter stringConverter = new StringHttpMessageConverter(); 
    stringConverter.setWriteAcceptCharset(false); 
    stringConverter.setSupportedMediaTypes(Arrays.asList(// 
      MediaType.TEXT_PLAIN, 
      MediaType.APPLICATION_JSON_UTF8, 
      new MediaType("application", "*+json"), 
      MediaType.TEXT_HTML, 
      MediaType.APPLICATION_JSON)); 
    return stringConverter; 
} 

当我调试DefaultHttpHeaderMapper,这个问题正是上面的JIRA提到,行730:

 else if (MessageHeaders.CONTENT_TYPE.equalsIgnoreCase(name)) { 

和静态变量映射回

public static final String CONTENT_TYPE = "contentType"; 

migration guide from 3.0 to 4.0节目object-to-json-transformer和header-richher的配置。虽然4.0指南显示

<int:chain> 
<int:object-to-json-transformer/> 
<int-http:outbound-gateway url="http://service"/></int:chain> 

好像在DSL相当于是

 .transform(new ObjectToJsonTransformer()) 

然而,并称是引入了杰克逊数据绑定转换器,它带回wacked out JSON I just fixed with the help of Gary Russell on this question

回答

0

找出解决方法。

   .expectedResponseType(String.class) 
       ) 
       .transform(new ObjectToJsonTransformer()) 
       .get(); 

工作,但上的toJSON在我的有效载荷线97

Object payload = ResultType.STRING.equals(this.resultType) 
      ? this.jsonObjectMapper.toJson(message.getPayload()) 
      : this.jsonObjectMapper.toJsonNode(message.getPayload()); 

导致JSON重新编码。所以我创建了一个自定义版本的类,并删除了该行,并且我现在正在测试的所有内容都可以使用。

doTransform()方法具有我需要的内容类型修复,但在我们的例子中该对象似乎不是必需的。任何关于如何更好地实现这一点的建议将不胜感激。