如何使用属性值在Scala中声明KafkaListener的主题

如何使用属性值在Scala中声明KafkaListener的主题,scala,apache-kafka,Scala,Apache Kafka,我有一个简单的Kafka/Scala项目,它创建了一个制作人。现在我正在尝试创建消费者,但是,当我使用以下代码时 @Service class KafkaService @Autowired()(producer: KafkaTemplate[String, Array[Byte]]){ @Value("${spring.kafka.topic}") val topic : String = null def sendMessage(msg: String): Unit = {

我有一个简单的Kafka/Scala项目,它创建了一个制作人。现在我正在尝试创建消费者,但是,当我使用以下代码时

@Service
class KafkaService @Autowired()(producer: KafkaTemplate[String, Array[Byte]]){

  @Value("${spring.kafka.topic}") val topic : String = null

  def sendMessage(msg: String): Unit = {
    System.out.println(s"Writing the message $msg to the topic ${this.topic}")
    producer.send(topic, msg.getBytes());
  }

  @KafkaListener(id="test", topics="${this.topic}")
  def consume(record: ConsumerRecord[String, String]): Unit = {
    System.out.println(s"Consumed Strinsg Message : ${record.value()}")
  }

}
我得到以下错误

[ERROR] ...\service\KafkaService.scala:26: error: type mismatch;
[ERROR]  found   : String("${this.topic}")
[ERROR]  required: Array[String]
[ERROR]   @KafkaListener(id="test", topics="${this.topic}")
我错过了什么

我也尝试了以下方法

@Configuration
public class CommonConfiguration{
    ...
    @Value("${spring.kafka.topic}")
    public String topic;
    ...
}
@Service
class KafkaService @Autowired()(producer: KafkaTemplate[String, Array[Byte]], config: CommonConfiguration){

  def sendMessage(msg: String): Unit = {
    val topics : Array[String] = config.getTopics();
    println(s"Writing the message $msg ${topics.mkString(" ")}")
    producer.send(config.topic, msg.getBytes());
  }

  @KafkaListener(id="test", topics="#{config.topic.split(',')}")
  def consume(record: ConsumerRecord[String, String]): Unit = {
    System.out.println(s"Consumed Strinsg Message : ${record.value()}")
  }

}

仍然不走运,但制作人上的控制台日志得到了正确的值。

错误表明主题需要数组[String]类型,而您提供了字符串类型。您需要将主题字符串转换为数组

注释看起来非常类似于Spring,您可以在Spring中执行以下操作

@Value("#{'${kafka.topic}'.split(',')}")

有关更多信息,请参阅或

A感谢您的帮助,但我在标题中指定Scala是有原因的。我尝试了这种方法,但它不起作用。我回答的要点是,您需要一种将字符串类型转换为Array[String]的方法。我还看到kafka侦听器正在读取值“${this.topic}”,而不是主题的实际值。如果是这种情况,那么您会将错误消息视为字符串(“topicName”),而不是字符串(${this.topic}”)。Gist对我没有帮助,我已经基于其他问题尝试过了。我需要实际值。请参阅更新。看起来这是在使用Scala不支持的SpEL。因此,当我确认Scala不支持它时,这不是一个好答案,我将添加链接,但我还需要否决投票。根据您的原始代码,您可以尝试@KafkaListener(topics=“{{uu listener.topic}”),这是我们在spring kafka(java)中使用的方法。它可能在Scala中工作,也可能不工作。这里看起来与此相关
@KafkaListener(id="scala", topics=Array("#{'${spring.kafka.topic}'.split(',')}"))