需要帮助在注释值中使用SPEL?

时间:2018-03-12 05:13:49

标签: lambda spring-annotations spring-el spring-kafka

尝试低于SPEL表达式,但无法正常工作。需要帮助!

@KafkaListener(topics = "#{Arrays.asList(${kafka.topic.helloworld}.split(',')).stream().map(p -> p+envSuffix).toArray(String[]::new)}")

3 个答案:

答案 0 :(得分:1)

首先,我看到${kafka.topic.helloworld}必须包装到'',因为属性占位符首先工作,然后SpEL会将结果视为活动变量。例如,你有foo,bar,baz。它在Java中看起来如何?只不过是错误的代码。但是当它是"foo,bar,baz"时,语言知道它是一个字符串。与SpEL相同 - 它必须像'${kafka.topic.helloworld}'

但并非全部。我担心SpEL不支持lambdas。我建议你有一些实用工具bean,你可以从这个表达式调用,如:

@KafkaListener(topics = "myUtility.parseTopics('${kafka.topic.helloworld}')")

所有硬转换逻辑都将在parseTopics()实用程序Java方法中完成。

SpEL中有一个集合Projection feature,但你仍然需要在这里和那里进行数组操作。

答案 1 :(得分:0)

解决方案是:将lambda添加到注释中的一种方法如下:  在KafkaReceiver类的方法中 -

@Autowired
  TopicUtil                      topicUtil;


  @KafkaListener(topics = "#{topicUtil.suffixTopics()}")


  //In the TopicUtil - add the follwoing method

  public String[] suffixTopics() {
      return Arrays.asList(pTopics.split(",")).stream().map(p -> p + envSuffix).toArray(String[]::new);
  }

答案 2 :(得分:-1)

@Tuneit您可以像这样直接设置kafka主题。 @KafkaListener(topics =“ $ {kafka.topic.helloworld}”)

application.properties kafka.topic.helloworld =