Java 用于使用空值或空值更新信息的REST API
我有一个关于如何最好地构建能够修改数据库中记录的API的一般性问题 假设我们有一个包含10列的表,我们可以使用REST(GET)查询这10列。JSON响应将包含所有10个字段。这是很容易的,工作没有问题 下一步是有人想通过POST创建新记录。在这种情况下,此人只发送JSON请求中10个字段中的8个。然后,我们将只填充数据库中的8个字段(其余字段将为空)。这也没有问题 但是如果有人想要更新记录,会发生什么呢?我们在这里看到了各种各样的可能性,有优缺点Java 用于使用空值或空值更新信息的REST API,java,rest,jackson,resteasy,Java,Rest,Jackson,Resteasy,我有一个关于如何最好地构建能够修改数据库中记录的API的一般性问题 假设我们有一个包含10列的表,我们可以使用REST(GET)查询这10列。JSON响应将包含所有10个字段。这是很容易的,工作没有问题 下一步是有人想通过POST创建新记录。在这种情况下,此人只发送JSON请求中10个字段中的8个。然后,我们将只填充数据库中的8个字段(其余字段将为空)。这也没有问题 但是如果有人想要更新记录,会发生什么呢?我们在这里看到了各种各样的可能性,有优缺点 只发送应该更新的内容。 问题:如何显式清空/删
+----+----------+---------------+-----+--------+-------+
| ID | Name | Country | Age | Weight | Phone |
+----+----------+---------------+-----+--------+-------+
| 1 | Person 1 | Germany | 22 | 60 | 12345 |
| 2 | Person 2 | United States | 32 | 78 | 56789 |
| 3 | Person 3 | Canada | 52 | 102 | 99999 |
+----+----------+---------------+-----+--------+-------+
获取…/人/2
{
"id" : 2,
"name" : "Person 2",
"country" : "United States",
"age" : 22,
"weight" :62,
"phone": "56789"
}
{
"id" : 2,
"name" : "Person 2",
"country" : "United States",
"age" : 22,
"weight" :78
}
现在我想更新他的体重,去掉电话号码
放…/人/2
{
"id" : 2,
"name" : "Person 2",
"country" : "United States",
"age" : 22,
"weight" :62,
"phone": "56789"
}
{
"id" : 2,
"name" : "Person 2",
"country" : "United States",
"age" : 22,
"weight" :78
}
或
现在,数据库应该如下所示:
+----+----------+---------------+-----+--------+-------+
| ID | Name | Country | Age | Weight | Phone |
+----+----------+---------------+-----+--------+-------+
| 1 | Person 1 | Germany | 22 | 60 | 12345 |
| 2 | Person 2 | United States | 32 | 78 | NULL |
| 3 | Person 3 | Canada | 52 | 102 | 99999 |
+----+----------+---------------+-----+--------+-------+
问题是
我们这样扩展桌子(萨利里)
使用API的人不知道JSON中有一个新的工资字段。此人现在想再次更改某人的电话号码,但不发送工资。这也将清空工资:
{
"id" : 3,
"name" : "Person 3",
"country" : "Cananda",
"age" : 52,
"weight" :102,
"phone" : null
}
+----+----------+---------------+-----+--------+--------+-------+
| ID | Name | Country | Age | Weight | Salery | Phone |
+----+----------+---------------+-----+--------+--------+-------+
| 1 | Person 1 | Germany | 22 | 60 | 1929 | 12345 |
| 2 | Person 2 | United States | 32 | 78 | 2831 | NULL |
| 3 | Person 3 | Canada | 52 | 102 | NULL | NULL |
+----+----------+---------------+-----+--------+--------+-------+
工资不应为空,因为它不是在JSON请求中设置的一种常见的技术是跟踪实体POJO上的更改
颜色
=黑色、大小
=空值和年龄
=空值加载狗size
设置为null(设置程序将此字段标记为已更改)POJO将有一个内部状态,知道
大小
已更改,因此将该字段包括在更新中<另一方面,代码>年龄从未设置,因此保持不变。jOOQ就是这样工作的,我相信还有其他的。您可以如下控制空值或空值
public class Person{
@JsonInclude(JsonInclude.Include.NON_NULL)
private BigDecimal salary; // this will make sure salary can't be null or empty//
private String phone; //allow phone Number to be empty
// same logic for other fields
}
i) 当您更新重量和删除电话号码时,请客户机发送需要更新的字段以及记录标识符(在本例中为id)
{
"id" : 2,
"weight" :78,
"phone" : null
}
ii)由于您将工资添加为一个额外的列,这是必填字段,客户应该知道。您可能需要重新设计合同
null
的形式发送字段的影响。当然,假设服务器端的验证是严格的,并且确保了完整性
ObjectMapper mapper = new ObjectMapper();
TypeReference<HashMap<String, Object>> typeReference = new TypeReference<>() {};
HashMap<String, Object> jsonMap = mapper.readValue(json, typeReference);
jsonMap.entrySet().stream().map(Map.Entry::getKey).forEach(System.out::println);
data class PlacementRequestDto(
val contentId: Int,
@param:JsonProperty(required = true)
val tlxPlacementId: Int?,
val keywords: List<Int>,
val placementAdFormats: List<Int>
)