Java 在另一个类上调用get方法时获取空数据

Java 在另一个类上调用get方法时获取空数据,java,methods,apache-kafka,parameter-passing,Java,Methods,Apache Kafka,Parameter Passing,我试图在我的应用程序类中显示另一类事务的数据。我创建了Transaction的一个新实例,并将其传递到sendUserNotification方法中,但是当我调用数据上的get方法时,它返回为null 应用程序类 public class Application { private static final String TOPIC = "suspicious-transactions"; private static final String BOOTSTR

我试图在我的
应用程序
类中显示另一类
事务
的数据。我创建了
Transaction
的一个新实例,并将其传递到
sendUserNotification
方法中,但是当我调用数据上的get方法时,它返回为null

应用程序类

public class Application {
    private static final String TOPIC = "suspicious-transactions";
    private static final String BOOTSTRAP_SERVERS = "localhost:9092,localhost:9093,localhost:9094";

    public static void main(String[] args) {
        Application kafkaConsumerApp = new Application();

        String consumerGroup = "user-notification-service";
        if (args.length == 1) {
            consumerGroup = args[0];
        }

        System.out.println("Consumer is part of consumer group " + consumerGroup);

        Consumer<String, Transaction> kafkaConsumer = kafkaConsumerApp.createKafkaConsumer(BOOTSTRAP_SERVERS, consumerGroup);

        kafkaConsumerApp.consumeMessages(TOPIC, kafkaConsumer);

    }

    public static void consumeMessages(String topic, Consumer<String, Transaction> kafkaConsumer) {
        kafkaConsumer.subscribe(Collections.singletonList(topic));

        while (true) {
            ConsumerRecords<String, Transaction> consumerRecords = kafkaConsumer.poll(Duration.ofSeconds(1));

            if (consumerRecords.isEmpty()) {
                //do something
            }

            for (ConsumerRecord<String, Transaction> record : consumerRecords) {
               Transaction transaction =  new Transaction();
               sendUserNotification(transaction);

                System.out.println(String.format("Received record (key: %s, value %s, partition: %d, offset: %d",
                        record.key(), record.value(), record.partition(), record.offset()));
            }
        }
    }

    public static Consumer<String, Transaction> createKafkaConsumer(String bootstrapServers, String consumerGroups) {
        Properties properties = new Properties();

        properties.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
        properties.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer .class.getName());
        properties.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
        properties.put(ConsumerConfig.GROUP_ID_CONFIG, consumerGroups);
        properties.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, false);

        return new KafkaConsumer<>(properties);
   }

    private static void sendUserNotification(Transaction transaction) {
        // Print transaction information to the console
        String h =transaction.getUser();

        System.out.println(String.format("Sending user %s notification about a suspicious transaction of %f in their account originating in %s", h, transaction.getAmount(), transaction.getTransactionLocation()));

    }
public class Transaction {
    private String user;
    private double amount;
    private String transactionLocation;

    public String getUser() {
        return user;
    }

    public double getAmount() {
        return amount;
    }

    public String getTransactionLocation() {
        return transactionLocation;
    }

    public void setUser(String user) {
        this.user = user;
    }

    public void setAmount(double amount) {
        this.amount = amount;
    }

    public void setTransactionLocation(String transactionLocation) {
        this.transactionLocation = transactionLocation;
    }

    @Override
    public String toString() {
        return "Transaction{" +
                "user='" + user + '\'' +
                ", amount=" + amount +
                ", transactionLocation='" + transactionLocation + '\'' +
                '}';
    }

    /**
     * Kafka Deserializer implementation.
     * Deserializes a Transaction from JSON to a {@link Transaction} object
     */
    public static class TransactionDeserializer implements Deserializer<Transaction> {

        @Override
        public Transaction deserialize(String topic, byte[] data) {
            ObjectMapper mapper = new ObjectMapper();
            Transaction transaction = null;
            try {
                transaction = mapper.readValue(data, Transaction.class);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return transaction;

        }
    }
输出

Consumer is part of consumer group user-notification-service
Sending user null notification about a suspicious transaction of 0.000000 in their account originating in null
Received record (key: dkelly9283, value Transaction{user='dkelly9283', amount=1653.32, transactionLocation='China'}, partition: 0, offset: 12
Sending user null notification about a suspicious transaction of 0.000000 in their account originating in null
Received record (key: msmith2015, value Transaction{user='msmith2015', amount=50.43, transactionLocation='California'}, partition: 1, offset: 12


您需要将值传递给用户字段。在java中,引用变量字段(在本例中为字符串用户)默认初始化为null。您可以使用构造函数或setUser()

创建事务的新实例后:

Transaction tr = new Transaction();
tr.setUser("User"); 
tr.setAmount(100); 
tr.setTransactionLocation("Location");

谢谢,我不知道我怎么忘了做那件事,哈哈。你能举例说明你的意思吗?我尝试了setUser(key)并传入了一个record.key变量,该变量对用户有效,但我无法获取金额和位置。@orangeblue98您应该使用“public void setAmount(double d)”和“public void setTransactionLocation(String s)”方法。我写了一个例子