Spring DSL:在变压器中使用消息头

时间:2019-01-28 08:09:34

标签: spring spring-integration spring-integration-dsl spring-dsl

我有如下所示的xml,在运行时我要动态处理。首先是第一次,然后是等

<tag1> 
  <tag2> 
.
.
.
  </tag2>
  <tag2>
.
.
.
  </tag2>
</tag1>

案例1:工作代码发送静态xslt参数:

.transform(Transformers.xslt(this.config.getSome().getXslt(), xsltParameters(1 or 2)))

public Tuple2[] xsltParameters(int number)
{
    final SpelExpressionParser parser = new SpelExpressionParser();
    final List<Tuple2<String,Expression>> parameters = new ArrayList<>();

    parameters.add(Tuples.of("Id1", parser.parseRaw(String.format("headers['%s']",ID1))));
    parameters.add(Tuples.of("Id2", parser.parseRaw(String.format("headers['%s']",ID2))));
    parameters.add(Tuples.of("tagNumber", parser.parseRaw(String.format("%d",number))));

    return parameters.toArray(new Tuple2[]{});
}

上面正在工作,变压器可以转换为xslt。

情况2:我想传递动态数字时出错:

.transform(Message.class, m-> Transformers.xslt(this.config.getSome().getXslt(), xsltParameters())

xsltparametr(){
parameters.add(Tuples.of("tagNumber", 
parser.parseRaw(String.format("headers['%s']",COUNT))));
}

转换时出错:

test.xslt的158行出现错误(在158行之前工作正常) XPTY0004:不允许将一个以上项目的序列作为starts-with()的第一个参数(“ xxmmyty”,“ xxmmyty”)

我在第158行的xslt

<xsl:if test="starts-with(xc:tag1/xc:tag2[$count]/xc:trade/xcml:header/xcml:Identifier/xcml:tradeId[@IdScheme='urn:abcd.something'], 'XYZ')" >
<xsl:value-of select="tag" />
</xsl:if>

在具有相同xslt文件的CASE1中,我可以传递上面的代码,但是在动态传递(CASE2)的情况下,它会失败。

1 个答案:

答案 0 :(得分:0)

首先,看起来您使用的是足够老的Spring版本。 希望至少升级到5.0.x

第二,您的xsltParameters()是什么还不清楚。您对我们隐藏了它,而我们完全不知道您在那做什么。尽管我们可以假定您完全基于此方法:

@SafeVarargs
public static XsltPayloadTransformer xslt(Resource xsltTemplate,
                            Tuple2<String, Expression>... xslParameterMappings) {

因此,您在xsltParameters()中构建了Tuple2的数组。好。因此,可以访问需要构建适当表达式的参数中的标头。

我很确定它可以是FunctionExpression

.transform(Transformers.xslt(this.config.getSome().getXslt(), 
            Tuples.of("foo", new FunctionExpression<Message<?>>(m -> m.getHeader.get("int_val"))))).

您对lambda所做的操作不能与该工厂的变压器一起使用。

更新

您需要修改xsltParameters()以接受String。这将只是原始表达表示形式。

因此,您的CASE1将是这样的:

.transform(Transformers.xslt(this.config.getSome().getXslt(), xsltParameters("'1'")))

其含义为文字表达

CASE2将如下所示:

.transform(Transformers.xslt(this.config.getSome().getXslt(), xsltParameters("headers.int_val")))