首页 > 解决方案 > 如何从模型对象访问特定的字段列表

问题描述

我有以下从数据库返回的 Stream 类:

Stream<Transaction> transctions=transRepository.findByTransctionId();

public class Transaction{

String  transctionId;
String accountId;
String transName;
String accountName;

}

现在我的要求如下:交易实体有 4 个字段。因此,Jpa 从 DB 中获取了所有 4 个字段。

但是需要这些数据的客户,他已经发送了他正在从事务模型中查找的列表中的columnsName

List<String> columnNames=Arrays.asList("transctionId","accountName")

我已将此数据发布到 Kafka。我必须从该流中获取每个 Transction 并将其发布到 kafka。

但是 cline 只寻找这 2 个字段“transctionId”、“accountName”应该作为 Kafka 事务的一部分而不是所有 4 个字段。

The data should go in form of json to Kafa having below format:
{

 "transctionId":"1234",
 "accountName" :"test-account"
}

基本上只有那些字段应该转到他们要求的 kafka,而不是将整个 pojo 转换为 json 并发送。

有没有办法做到这一点?

标签: javaspringspring-boot

解决方案


如果你需要调用一个方法,但你只有它的名字,我知道的唯一方法是通过反射。我会这样做:

Stream<Transaction> transctions=transRepository.findByTransctionId();
List<Transaction> outTransactions = new ArrayList<>();
List<String> columnNames = new ArrayList<>();
transactions.forEach(tr -> {
    Transaction outTransaction = new Transaction();
    columnNames.forEach( col -> {
        try {
            var getMethod = tr.getClass().getMethod("get" + StringUtils.capitalize(col));
            Object value = getMethod.invoke(tr);
            String valueStr = value instanceof String ? value.toString() : "";
            var setMethod = outTransaction.getClass().getMethod("set" + StringUtils.capitalize(col));
            setMethod.invoke(outTransaction, valueStr);
        } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {
            e.printStackTrace();
        }
    });
    outTransactions.add(outTransaction);
});

有很多遍历,但是根据你的要求,这是我能想出的通用解决方案。此解决方案的另一个缺点是创建新的 Transaction 对象。这意味着如果事务很多,内存使用量会增加。也许可以优化此解决方案以利用来自数据库的流式传输。

另一种方法是为客户端发送给您的每组已知属性设置不同的端点。例如:

@GetMapping("/transaction_id_and_name")
List<Transaction> getTransactionsIdAndName() {
   ... obtain Transactions, return a new list of Transactions, with transaction_id and name ... }

@GetMapping("/transaction_id_and_status")
List<Transaction> getTransactionsNameAndStatus() {...}

推荐阅读