java - 如何简化 postgres 数据和 java 对象/json 有效负载之间的映射(反之亦然)
问题描述
该项目是简单的 rest api(springboot 框架),其中交换 json 消息并将有效负载保存到 Postgres 数据库。
实现了两种方法,第一种(http post)保存数据,第二种(http get)从数据库中检索数据。
初始 json 请求(执行 HTTP POST 时),payload 由客户端的要求预定义:
...
{
"characteristics" : [ {
"name" : "char1",
"value" : "value1"
}, {
"name" : "char2",
"value" : "value2"
}, {
"name" : "char3",
"value" : "value3"
}
]
}
Json 响应(在 HTTP GET 上)具有与请求完全相同的输出
...
{
"characteristics" : [ {
"name" : "char1",
"value" : "value1"
}, {
"name" : "char2",
"value" : "value2"
}, {
"name" : "char3",
"value" : "value3"
}
]
}
我的模型如下所示:
1.
public class Request {
...
@JsonProperty("characteristics")
private List<Characteristics> characteristics = new ArrayList<>();
//Getters and setters
}
public Class Characteristics {
@JsonProperty
private String name;
@JsonProperty
private String value;
//Getters and setters
}
关于 db 通信 - jpa 存储库已实现,并定义了一个本机查询以从 postgres 检索数据:
@Repository
public interface PostgresRepository extends JpaRepository<DbObject, Long> {
@Query(value = "SELECT * FROM someTableName", nativeQuery = true)
List<DbObject> getAll();
}
每个单独的特征“名称”都是 postgres 中的一个单独的列:
Column | Type |
----------------------+-----------------------------+
id | integer |
char1 | character varying(50) |
char2 | character varying(50) |
char3 | character varying(50) |
对于对 REST API 的每个 GET 调用,结果检索过程如下完成:
...
List<DbObject> dbObjectList = postgresRepo.getAll();
List<SpeedtestRequest> resultList = new ArrayList<>();
SingleResult singleResult;
for (DbObject dbObject : dbObjectList) {
List<Characteristics> characteristicsList = new ArrayList<>();
Characteristics char1 = new Characteristics("char1", dbObject.getChar1());
characteristicsList.add(char1);
Characteristics char2 = new Characteristics("char2", dbObject.getChar2());
characteristicsList.add(char2);
Characteristics char3 = new Characteristics("char3", dbObject.getChar3());
characteristicsList.add(char3);
singleResult = new SingleResult(characteristicsList)
resultList.add(speedtestRequest);
}
return ResponseEntity.ok(objectMapper.writeValueAsString(resultList));
在数据库中存储数据时,也会发生相同的过程,反之亦然。每个特征都必须被读取(解析)并存储在数据库的特定列中。
我的问题是 - 数据检索和每列到 Characteristic 对象中单个特征的映射可以以某种方式简化以减少此样板代码吗?
解决方案
您可以很好地将 REST 输入存储为json 或 jsonb文档。为此,您必须更改表架构。您的表架构最终将如下所示:
Column | Type |
----------------------+-----------------------------+
id | integer |
document | jsonb |
请注意,Postgres 中的 JSON 支持从 9.5 及更高版本开始。(9.4 / 9.3 / 9.2 不受支持)
推荐阅读
- maven - SpringBoot 和 GitLab CI 给出了 maven 万无一失的错误
- c++ - 增强 UE4 插件中的野兽集成问题?
- php - 我将如何运行 Amazon SQS 的队列?这是一个 cron 工作吗?
- c++ - 这个 C++ 中的数组输入代码有什么问题?
- excel - 在列中查找一个值,然后在同一行的其他位置更改一个值
- javascript - 火狐window.print() android
- excel - 如果列已经包含某个值,则自动递增
- pandas - 将非结构化数据解析为 pandas 数据框
- c++ - 如何为 VS Code 问题匹配器链接目录
- windows - Stunnel 证书被拒绝