Spring DSL: использовать заголовок сообщения в преобразователе
У меня есть XML, как показано ниже, во время выполнения я хочу динамически обрабатывать. Первый раз первый, потом и т. Д.
<tag1>
<tag2>
.
.
.
</tag2>
<tag2>
.
.
.
</tag2>
</tag1>
CASE1: рабочий код отправляет статический параметр 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[]{});
}
Выше работает и трансформатор может trasnform 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))));
}
ОШИБКА при преобразовании:
Ошибка в строке 158 test.xslt(до строки 158 работала нормально) XPTY0004: последовательность из более чем одного элемента не допускается в качестве первого аргумента start-with() ("xxmmyty", "xxmmyty")
Мой xslt в строке 158
<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>
В CASE1 с тем же файлом xslt я могу передать приведенный выше код, но в случае динамической передачи (CASE2) это дает сбой.
1 ответ
Прежде всего, похоже, что вы используете достаточно старую версию 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"))))).
То, что вы делаете с лямбдой, нельзя сочетать с трансформатором с этой фабрики.
ОБНОВИТЬ
Вы должны изменить свой xsltParameters()
принять String
вместо. Который будет просто представление необработанного выражения.
Итак, ваш CASE1 будет выглядеть так:
.transform(Transformers.xslt(this.config.getSome().getXslt(), xsltParameters("'1'")))
Со значением как буквальным выражением.
CASE2 будет выглядеть так:
.transform(Transformers.xslt(this.config.getSome().getXslt(), xsltParameters("headers.int_val")))