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

我即将开始在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#中使用它看不出任何好处.它似乎增加了更多的复杂性.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值