1

我已经在我的 PaaS 环境中安装了 Spring XD,对于遗留问题,我坚持使用 1.0.0.M1 版本。(参见参考文档)。我的目标是使用该http-client模块调用 http rest API。我的流定义是:

http | httpclient --url='''<my_url>''' --http-method=POST --mappedRequestHeaders=HTTP_REQUEST_HEADERS | log --expression=#root

不幸的是,由于http模块仅将有效负载发送到httpclienthttpclient由于缺少内容类型标头,因此返回 415 错误。

考虑到我既不能添加新模块也不能修改现有模块(在这样的版本中,您只能引用 spring 存储库),我想使用一个tranform模块来注入 content-type 标头。

我怎样才能实现这样的目标?

非常感谢您的帮助。

编辑

我刚刚发现 httpclient 处理器(链接)支持 headersExpression 用于派生要使用的 http 标头映射的 SpEL 表达式。然而:

--headers-expression='{Content-Type:'application/json'}'

给出以下解析异常:

    org.springframework.expression.spel.SpelEvaluationException: EL1008E:
(pos 1): Property or field 'Content' cannot be found on object of type 'org.springframework.messaging.support.GenericMessage' - maybe not public?
4

1 回答 1

1

有关更多 StackTrace 的信息,请参阅GH 问题

首先,它不再是 Spring XD。Spring Cloud Dataflow 是不同的产品,它的行为可能与之前的 Spring XD 不同。

第二:它已经在版本1.0.0.RC1中。所以,考虑升级。

现在谈谈问题。看:

标头表达式

 A SpEL expression used to derive the http headers map to use.

因此,此表达式必须返回 aMap并由代码确认:

if (properties.getHeadersExpression() != null) {
    Map<?, ?> headersMap = properties.getHeadersExpression().getValue(message, Map.class);

现在让我们来看看这个问题:

org.springframework.expression.spel.SpelEvaluationException: EL1008E:(pos 1): Property or field 'Content' cannot be found on object of type 'org.springframework.messaging.support.GenericMessage' - maybe not public?
 org.springframework.expression.spel.ast.PropertyOrFieldReference.readProperty(PropertyOrFieldReference.java:224) ~[spring-expression-4.2.4.RELEASE.jar!/:4.2.4.RELEASE]
 org.springframework.expression.spel.ast.PropertyOrFieldReference.getValueInternal(PropertyOrFieldReference.java:94) ~[spring-expression-4.2.4.RELEASE.jar!/:4.2.4.RELEASE]
 org.springframework.expression.spel.ast.PropertyOrFieldReference.getValueInternal(PropertyOrFieldReference.java:81) ~[spring-expression-4.2.4.RELEASE.jar!/:4.2.4.RELEASE]
 org.springframework.expression.spel.ast.OpMinus.getValueInternal(OpMinus.java:98) ~[spring-expression-4.2.4.RELEASE.jar!/:4.2.4.RELEASE]

OpMinus是根本原因。因此,SpEL 将Content-Type表达式视为minus运算符。

当然,可悲的是,但解决方法就像将key引号括起来一样:

--headers-expression={'Content-Type':'application/json'}
于 2016-07-05T17:10:28.267 回答