2016-10-17 2 views
1

Мне нужно разбить строку, присутствующую в заголовках.headers - spel для разделения строки

<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")); 
+0

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

+0

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

+0

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

ответ

1

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

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

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

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

Я бы не сказал, что это проблема SpEL. Вот как работает Java-рефлекс.

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

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

Got it..works отлично !! Очень жаль, что если мой вопрос смущает вас. –

Смежные вопросы