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