Spring DSL: использовать заголовок сообщения в преобразователе - PullRequest
0 голосов
/ 28 января 2019

У меня есть 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[]{});
}

Выше работает, и преобразователь может передать xslt.

CASE2: Получениеошибка, когда я хочу передать динамическое число:

.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 Ответ

0 голосов
/ 28 января 2019

Прежде всего, похоже, что вы используете достаточно старую версию 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")))
...