我必须拆分标题中的字符串。
<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"));
答案 0 :(得分: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')