首页 > 解决方案 > 也许不公开或无效?使用 Spring 的 Websocket 和 Kafka

问题描述

当我尝试使用来自主题的数据(主题名称基于用户)并且在运行时我试图使用来自主题的消息时,但我收到以下错误。

原因:org.springframework.expression.spel.SpelEvaluationException:EL1008E:在“org.springframework.beans.factory.config.BeanExpressionContext”类型的对象上找不到属性或字段“consumerProperties” - 可能不是公共的或无效的?

这是我的代码

@Service
public class kafkaConsumerService {


    private SimpMessagingTemplate template;

     KafkaConsumerProperties consumerProperties;

     @Autowired
    public kafkaConsumerService(KafkaConsumerProperties consumerProperties, SimpMessagingTemplate template) {
         this.consumerProperties=consumerProperties;
         this.template=template;
    }

    @KafkaListener(topics = {"#{consumerProperties.getTopic()}"})
    // @KafkaListener(topics="Chandan3706")
    public void consume(@Payload Message message) {
        System.out.println("from kafka topic::" + message);
        template.convertAndSend("/chat/getMessage", message);
    }

}

我的 KafkaConsumerProperties.class

@Component
@ConfigurationProperties(prefix="kafka.consumer")
public class KafkaConsumerProperties {

    private String bootStrap;
    private String group;
    private String topic;

    public String getBootStrap() {
        return bootStrap;
    }

    public void setBootStrap(String bootStrap) {
        this.bootStrap = bootStrap;
    }

    public String getGroup() {
        return group;
    }

    public void setGroup(String group) {
        this.group = group;
    }

    public String getTopic() {
        return topic;
    }

    public void setTopic(String topic) {
        this.topic = topic;

    }

    @Override
    public String toString() {
        return "KafkaConsumerProperties [bootStrap=" + bootStrap + ", group=" + group + ", topic=" + topic + "]";
    }
}

提前致谢

标签: springspring-websocketspring-kafka

解决方案


由于您没有为您的KafkaConsumerProperties组件提供任何 bean 名称,因此默认的是不大写的 class name。那是一个。

您在 bean 定义阶段使用的表达式@KafkaListener是常规bean 定义阶段表达式,因此根对象是 some BeanExpressionContext,但不是您的侦听器 bean,因为您尝试通过该属性进行访问。

不确定您是否需要KafkaConsumerProperties此侦听器中的该属性,但表达式必须要求kafkaConsumerPropertiesbean:

@Service
public class kafkaConsumerService {


    private SimpMessagingTemplate template;

     @Autowired
    public kafkaConsumerService(SimpMessagingTemplate template) {
         this.template=template;
    }

    @KafkaListener(topics = {"#{kafkaConsumerProperties.topic}"})
    // @KafkaListener(topics="Chandan3706")
    public void consume(@Payload Message message) {
        System.out.println("from kafka topic::" + message);
        template.convertAndSend("/chat/getMessage", message);
    }

}

推荐阅读