我正在使用最新的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。
答案 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()方法具有我需要的内容类型修复,但在我们的情况下,该对象似乎不是必需的。关于如何更好地实现这一点的任何建议都将不胜感激。