java - 如何从模型对象访问特定的字段列表
问题描述
我有以下从数据库返回的 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 并发送。
有没有办法做到这一点?
解决方案
如果你需要调用一个方法,但你只有它的名字,我知道的唯一方法是通过反射。我会这样做:
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() {...}
推荐阅读
- spring-boot - 将 Spring JPA 存储库专门用于测试
- node.js - 为什么测试脚本一直无法完成测试脚本执行?JEST nodejs 测试超时错误
- postgresql - 如何从 docker 中删除所有 postgresql 数据,包括创建的用户和数据库?
- r - 如何获取矢量并将其复制粘贴到我的 R 代码中,就像我手动输入它一样?
- postgresql - 有没有办法测量 PostgreSQL 实例中的日志量?
- java - 分配新变量(setter)并调用repaint()后无法更改paintComponent的输出
- android - 如何在 AWS pinpoint 中创建可由 Android Kotlin 中的 OnClick 事件触发的事件
- json - 使用 Python 将 Jira Json 转换为数据框。一列保留为json的问题
- javascript - 如何清除被嘲笑的剧作家回应?
- ios - 将视频上传到云存储时出错,但不是图像 (Swift/Xcode/iOS)