Clojure,如何将正确的参数传递给函数

时间:2018-08-17 20:17:59

标签: clojure

我是Clojure世界中的新手。我的宠物项目是写卡夫卡的消费者/生产者。 www中有很多话题,但我遇到了误会。

有一个密码

function tester(prevState, props) {
  return {
    ...prevState,
    data: 'new Data',
  };
}

class App extends Component {
  constructor() {
    super();
    this.state = {
      data: '',
    };
  }

  componentDidMount() {
    this.setState(tester);
  }

  render() {
    return (
      <div>{this.state.data}</div>
    );
  }
}

我只想通过(ns producer (:require [clojure.tools.logging :as log]) (:import (java.util Properties) (org.apache.kafka.common.serialization StringSerializer) (org.apache.kafka.clients.producer KafkaProducer ProducerRecord)) (:gen-class)) (defn create-kafka-producer [server] (let [producer-props { "value.serializer" StringSerializer "key.serializer" StringSerializer "bootstrap.servers" server }] (KafkaProducer. producer-props))) (defn send-single-message [producer topic-name record] (.send producer (ProducerRecord. topic-name (str "Value: " (.value record))))) (defn -main [] (def svr "localhost:8084") (def producer (create-kafka-producer svr)) (send-single-message producer "Test msg")) 函数将一些味精传递到kafka中。但是,正如您在代码示例中看到的那样,使用的是(.value记录),当我尝试传递“ Test msg”字符串时,它崩溃了,并显示了随后的错误

send-single-message

我知道这是因为我传递了没有Exception in thread "main" java.lang.IllegalArgumentException: No matching field found: value for class java.lang.String 的字符串对象 那么,如何解决这个问题呢?提前致谢 ps。我尝试通过其他结构,但没有结果或其他错误

1 个答案:

答案 0 :(得分:1)

正如您所指出的,该错误是因为您试图获取所传递对象的value字段,但是您正在传递的字符串中没有value字段。

检查ProducerRecord的构造函数签名,它接受类型为V的泛型参数(就Clojure而言,这只是一个Object)。我只需要直接传递String并忽略value字段访问即可。