如何在带有Scala的注释中为数组使用Spring表达式语言

如何在带有Scala的注释中为数组使用Spring表达式语言,spring,scala,apache-kafka,spring-kafka,spring-el,Spring,Scala,Apache Kafka,Spring Kafka,Spring El,我有一个简单的Scala项目,看起来像这样 @Configuration public class CommonConfiguration{ ... @Value("${spring.kafka.topic}") public String topic; ... } @Service class KafkaService @Autowired()(producer: KafkaTemplate[String, Array[Byte]], config: Commo

我有一个简单的Scala项目,看起来像这样

@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 = {
    println(s"Writing the message $msg ${config.topic}")
    producer.send(config.topic, msg.getBytes());
  }

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

}
这给了我一个错误

KafkaService.scala:26: error: type mismatch;
[ERROR]  found   : String("#{\'${spring.kafka.topic}\'.split(\',\')}")
[ERROR]  required: Array[String]
[ERROR]   @KafkaListener(id="test", topics= "#{'${spring.kafka.topic}'.split(',')}")
我尝试对每个建议使用
{${spring.kafka.topic}.split(',')}
,但我无法让它工作。制片人很好地理解了这个话题。如何在Scala中使用Spring表达式语言

这是工作的Java版本

@Service
public class KafkaJavaService {
    @KafkaListener(id="test", topics="#{'${spring.kafka.topic}'.split(',')}")
    public void consume(ConsumerRecord<String, String> record){
        System.out.println("Consumed String Message : "+record.value())
    }
}
@服务
公共类卡夫卡瓦卡服务{
@KafkaListener(id=“test”,topics=“#{${spring.kafka.topic}.split(',')}”)
公共无效消费(消费者记录记录){
System.out.println(“使用的字符串消息:+record.value())
}
}
根据,看起来
topics=Array(“…”)
应该可以工作

阅读
@RequestMapping
文档:

它接受一个字符串数组参数作为其路径映射

因此,这可以通过java实现:

@RequestMapping(“MYVIEW”)

但在scala中,我需要使用:

@RequestMapping(数组(“MYVIEW”))

scala版本有意义,因为注释需要字符串数组。但为什么上面的代码在java中工作,它不应该给出编译时错误吗

编辑


这在技术上也不是一回事,因为我可以使用CSV。即使有效,它也将是一个1字符串数组,除非数组构造函数做了一些改进

这不应该有什么区别;正如我所说的,如果
String[]
元素中的表达式解析为
String[]
,我们会递归地将其拆分(展平)。见和


尝试在这些方法中设置断点;我没有安装Scala,否则我会看一看。

主题的类型是
String[]
。我不知道斯卡拉;也许它不会在注释中将单个字符串强制为
String[]
(与Java不同)<代码>必填项:数组[字符串]。在Java
topics={“{…}”}
中也可以使用;我不知道Scala的等效语法。Spring对属性进行递归分析(因此它将展平一个
字符串[String[]]
)。为此,我几乎假设了所有这些,因为我试图保持问题的简单性。如果你遇到了一种方法,请随意回答。我更新了以更清楚地说明,真正的问题是在注释上下文中使用它。显示带有
数组
语法的scala版本。我会尝试一下,但我认为这不管用,因为它会声称需要一个常量,所以它在Java中实际上工作得很好,我只是不认为Scala以同样的方式支持SpEL。这在技术上也是不一样的,因为另一种方式我可以使用CSV。如果数组构造器没有什么特别之处的话,即使它工作了,它也将是一个1字符串的数组;编辑您的问题以显示当前状态以及您现在遇到的错误。为了确认,Scala spec说
数组(const)
是一个常量,而JLS 9.7.3用于在Java中当值需要数组时使用字符串。