我正在写卡夫卡消费者 我想将环境变量主题名称传递给@kafkalistener(topics = topic
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Service;
@Service
public class KafkaConsumer {
@Autowired
private EnvProperties envProperties;
private final String topic = envProperties.getTopic();
@KafkaListener(topics = "#{'${envProperties.getTopic()}'}",
groupId = "group_id")
public void consume(String message){
logger.info("Consuming messages " +envProperties.getTopic());
}
}
topics =“#{'$ {envProperties.getTopic()}'}” 在这条线 抛出错误。我的应用程序无法启动。必须根据环境变量动态设置此主题名称。
答案 0 :(得分:0)
通常,您不能从声明SpEL的bean中引用字段或属性。但是,@KafkaListener
具有支持它的特殊语法。
从版本2.1.2开始,SpEL表达式支持特殊的标记
__listener
,这是一个伪bean名称,代表该注释所在的当前bean实例。
因此,如果您将public EnvProperties getEnvProperties()
添加到类中,则类似
#{__listener.envProperties.topic}
应该工作。
答案 1 :(得分:0)
在KafkaConsumer类中,您需要进行以下更改:
@Autowired
public EnvProperties envProperties;
@KafkaListener(topics = "#{kafkaConsumer.envProperties.getTopic()}"
对我有用。