java patch_在java REST API中,使用PATCH与PUT更新实体

本文探讨了在Java中使用REST API进行开发时,如何处理PATCH请求的问题。作者指出,PATCH请求可能导致部分更新时的不一致性,如在Address实体中,line2字段可能被错误地设为null。同时,由于@Valid注解无法用于验证PATCH请求的输入,可能导致无效数据进入系统。文章讨论了使用PUT代替PATCH的可能性,以确保数据完整性和验证。作者还表达了对于使用动态类型语言开发者更倾向于PATCH的看法,并认为在Java等静态类型语言中,PATCH可能增加不必要的复杂性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我即将开始在Java中使用新的rest api进行开发.

我的问题是关于PATCH的使用 – 为什么?

可以说,我们有一个名为Address.java的实体

public class Address {

@Id

private Long id

@NotNull

private String line1;

private String line2; //optional

@NotNull

private String city;

@NotNull

private String state;

}

要创建一个新地址,我会做这个http请求:

POST http://localhost:8080/addresses

满足以下要求:

{

"line1" : "mandatory Address line 1","line2" : "optional Address line 2","city" : "mandatory City","state" : "cd"

}

假设创建的记录具有id 1

相应的@RestController AddressResource.java将具有以下方法:

@PostMapping(value = "/addresses")

public ResponseEntity

@valid将确保在将数据存储到表中之前实体有效.

现在假设,我从上面的公寓搬到街上的房子.如果我使用PATCH,它就会变成

PATCH http://localhost:8080/addresses/1

请求有效负载:

{

"line1" : "1234 NewAddressDownTheStreet ST","line2" : null

}

相应的@RestController方法是:

@PatchMapping(value = "/addresses/{id}")

public ResponseEntity

现在,如果你查询表,我的地址不是吗?

"line1" : "1234 NewAddressDownTheStreet ST",

可以看出,上述更新导致line2的值不正确.

这是因为在java中,在实例化类时,Address类中的所有实例变量都被初始化为null(如果它们是基元,则为默认初始值).因此无法区分line2被更改为null与默认值.

问题1)有没有一种标准的解决方法?

另一个缺点是,我不能使用@Valid注释来验证入口点的请求 – 因为它只是部分的.因此,无效数据可能会进入系统.

例如,假设有一个具有以下定义的附加字段:

@Min(0)

@Max(100)

private Integer lengthOfResidencyInYears,

并且用户不小心打了190(当他们真的意味着19年)时,它不会失败.

如果我使用了PUT,客户端需要发送完整的地址对象,而不是PATCH.

这样做的好处是我可以使用@Valid来确保地址确实有效

如果有一个前提是在进行任何更新之前必须始终完成GET,为什么不能使用PUT而不是PATCH?

我错过了什么吗?

在旁边

我的结论是使用动态类型语言的开发人员是使用PATCH的支持者,因为从静态类型语言行Java或C#中使用它看不出任何好处.它似乎增加了更多的复杂性.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值