2016-10-17 2 views
1

Je dois diviser la chaîne présente dans les en-têtes. Comment faire de ce tableau de chaînes en liste comme celle ci-dessous qui convertit la liste automatiquement.en-têtes - spel pour diviser la chaîne

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

J'ai essayé comme ci-dessous mais ne fonctionne pas correctement.

<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> 

d'intégration 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

Cela fonctionne très bien et les plans-tableau ont String [] mais juste obtenir l'erreur mentionnée ci-dessus dans la Mode débogage. –

+0

Qu'est-ce que 'debug mode'? Comment pouvons-nous le reproduire localement? Merci –

+0

Désolé pour la réponse tardive Artem. Je voulais dire les journaux de débogage. J'obtiens le tableau de String après split avec une virgule séparée. Veuillez suggérer la solution pour la question éditée. –

Répondre

1

Bon, maintenant, je vois votre problème.

Vous avez du code comme T(java.util.Arrays).asList((headers['plans'].split(',')))

En Java, il fonctionne très bien parce que le compilateur traiter un argument avec le type de tableau en tant que varargs.

Ici, nous avons un SpEL, qui dans la plupart des cas est basé sur l'invocation de méthode de réflexion. Donc, il n'y a pas d'optimisation du compilateur et nous nous retrouvons avec le fait de List<String[]> avec un élément, pas comme vous attendez List<String> avec deux éléments.

Je ne dirais pas que c'est un problème de SpEL. C'est ainsi que la réflexion Java fonctionne ici.

Pour résoudre votre problème, vous devriez envisager d'utiliser une autre array -> list utilitaire pour contourner VarArgs problème, par exemple:

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

J'ai tout compris! Vraiment désolé à ce sujet si ma question vous embrouille. –