![](/img/trans.png)
[英]Parse Json array init single object in Spring boot Rest Controller
[英]Spring Rest Controller: Accept single object and array under one URL
假設有一個 REST Controller 的端點接受一個 object 在體內:
@PostMapping("/ExampleObjects")
void mapping(@RequestBody ExampleObject object){ ....
如果要添加在同一端點下接受數組的功能,如下所示:
@PostMapping("/ExampleObjects")
void mapping(@RequestBody ExampleObject[] objects){ ....
有沒有辦法用給定的設計實現新功能而不破壞現有用戶?
將第一個端點稱為“/ExampleObject”怎么樣,因為它看起來是單數的?
讓您的 API 端點盡可能簡單、盡可能一致(在單個 API 中的不同端點之間)和盡可能容錯是一種很好的做法。
在任何情況下,您都希望使用通用List<ExampleObject>
而不是數組。
您可以只實現該方法的列表版本,使用僅包含單個實例的列表調用該方法。 您需要稍微考慮一下等式的一致性部分。 您將在 API 中實現哪些不同的端點。 這個解決方案適合大多數用例嗎?
Go 的解決方案對您的 API 用戶的意外影響最小。
目前,像 Jackson 之類的東西正在自動為您解析從 HTTP 請求正文到ExampleObject
。
您可以在代碼中進行解析並在解析期間決定它是ExampleObject
還是ExampleObject[]
的實例。 因此,您將有一個具有此簽名的方法:
@PostMapping("/ExampleObjects")
void mapping(@RequestBody String objectOrArray){
// code to parse String into ExampleObject or ExampleObject[] ...
這應該可以解決您的問題,但更好的 API 設計將具有 2 個不同的端點/URL。
那應該對你有幫助。
應用程序屬性:
spring.jackson.deserialization.accept-single-value-as-array=true
controller:
@PostMapping("/ExampleObjects")
void mapping(@RequestBody List<ExampleObject> objects){ ....
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.