簡體   English   中英

Spring rest api 相同的 Z572D4E421E5E6B9BC11D815E8A027112

[英]Spring rest api same url for bulk and single request

我想在 Spring 啟動應用程序中有這個 API:

發布/項目

{
  "name": "item1"
}

發布/項目

[
  {
    "name": "item1"
  },
  {
    "name": "item2"
  },
]

因此,同一端點可以接受 json 主體中的數組或單個元素。

不幸的是,這不起作用:

@PostMapping(path="items")
public ResponseEntity<String> items(@RequestBody  Item item) {}

@PostMapping(path="items")
public ResponseEntity<String> items(@RequestBody  List<Item> items) {}

我也試過這個:

@PostMapping(path="items")
public ResponseEntity<String> items(@RequestBody @JsonFormat(with= JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY) List<Item> items) {}

它不起作用。

如果我像這樣包裝列表:

public class Items {
   @JsonFormat(with= JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY) 
   private List<item> items;
}

那么不幸的是,我的請求正文將如下所示:

{
  "items": [
    {
      "name": "item1"
    },
    {
      "name": "item2"
    },
  ]
}

你知道我怎么能有這樣的 API 和 spring 引導?

您需要一個可以直接保存數組或 Object 的變量。 由於 Java 的 Static 類型限制,沒有直接的方法可以實現類似的目標。

到目前為止,我能想象到的唯一方法是創建一個采用某種通用類型的 API。

Object

@PostMapping(path="items")
public ResponseEntity<String> items(@RequestBody Object body) {
    if(body instanceof List) {
        
    } else {
        
    }
}

String

@PostMapping(path="items")
public ResponseEntity<String> items(@RequestBody String body) {
    if(body.charAt(0) == '[' && body.charAt(body.length() - 1) == ']') {
        
    } else if(body.charAt(0) == '{' && body.charAt(body.length() - 1) == '}') {
        
    } else {
        
    }
}

您將不得不手動完成大量工作。

此外,您不能創建具有相同路徑/items和相同方法POST的兩個 API,它們會引發編譯時錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM