headers - 拆分字符串

headers - spel to split the string

我必须拆分 headers 中的字符串。

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

如何将这个String数组变成如下图自动转换列表的List。

 @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"));

好的,现在我明白你的问题了。

您的代码类似于 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')