Spring Integration 4.2.1.RELEASE Con​​tent-type header未映射到

时间:2015-11-25 23:51:12

标签: json spring spring-mvc spring-integration

我正在使用最新的Spring Integration 4.2.1.RELEASE,使用DSL配置。我的请求没有从入站请求映射其HTTP标头内容类型。

有一个旧的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())

但是,添加它会引入Jackson-databind转换器,它会带回wacked out JSON I just fixed with the help of Gary Russell on this question

1 个答案:

答案 0 :(得分:0)

找出解决方法。

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

工作了,但第97行的toJson

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

导致我的有效负载中的JSON被重新编码。所以我创建了一个类的自定义版本并删除了该行,我现在测试的所有内容都可以工作。

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