заголовки — spel для разделения строки

#spring-integration #spring-el

#spring-интеграция #spring-el

Вопрос:

Я должен разделить строку, присутствующую в заголовках.

 <int:header name="plans-array" expression="headers['plans'].split(',')"/>
 

Как превратить этот массив строк в список, подобный приведенному ниже, который автоматически преобразует список.

  @Value("#{'${plans}'.split(',')}") 
 private List<String> myList;
 

Я пробовал, как показано ниже, но работает некорректно.

 <int:header name="plans-list" expression="T(java.util.Arrays).asList(headers['plans'].split(','))"/>
 

интеграция xml

 <int:channel id="splitChannel"/>
<int:header-enricher input-channel="splitChannel">
    <int:header name="isPlanExist" expression="T(java.util.Arrays).asList((headers['plans'].split(','))).contains('plan1')"/>
</int:header-enricher>
 

JUnit

     @Autowired
    @Qualifier("splitChannel")
    private MessageChannel splitChannel;

    @Test
    public void testSplit() {

String somePayload = "somePayload";
Message<String> stringPayload = MessageBuilder.withPayload(somePayload)
    .setHeader("plans", "plan1,plan2")
    .build();

MessagingTemplate template = new MessagingTemplate();
Assert.assertEquals(true, template.sendAndReceive(this.splitChannel, stringPayload).getHeaders().get("isPlanExist"));
 

Комментарии:

1. Это работает нормально, и планы-массив имеет строку [], но просто получает ошибку, упомянутую выше, в режиме отладки.

2. Что такое debug mode ? Как мы можем воспроизвести это локально? Спасибо

3. Извините за поздний ответ, Артем. Я имел в виду журналы отладки. Я получаю массив строк после разделения с разделением запятой. Пожалуйста, предложите решение для отредактированного вопроса.

4. Ну, а ты что, шпион? Почему бы не рассказать или не показать, как это работает? И в чем проблема с array и преобразованием его в list где-то ниже по потоку уже в Java-коде?

5. мы можем преобразовать его в donwstream, но просто проверяем возможность интеграции без java-кода на несколько строк.

Ответ №1:

Хорошо, теперь я понимаю вашу проблему.

У вас есть код, подобный T(java.util.Arrays).asList((headers['plans'].split(',')))

В Java это работает нормально, потому что компилятор обрабатывает один аргумент с типом массива как varargs .

Здесь у нас есть SpEL, который в большинстве случаев основан на вызове метода отражения. Таким образом, оптимизация компилятора отсутствует, и в итоге мы List<String[]> сталкиваемся с одним элементом, а не с тем, что вы ожидаете List<String> от двух элементов.

Я бы не сказал, что это проблема SpEL. Вот как здесь работает отражение Java.

Чтобы устранить вашу проблему, вам следует рассмотреть возможность использования какой-либо другой array -> list утилиты для обхода проблемы с varargs, например:

 T(org.springframework.util.CollectionUtils).arrayToList(headers['plans'].split(',')).contains('plan1')
 

Комментарии:

1. Понял .. работает отлично!! Очень сожалею об этом, если мой вопрос сбивает вас с толку.