springrestapi批量和单个请求的相同url

kgsdhlau  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(270)

我想在spring boot应用程序中使用此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) {}

它不起作用。
如果我把清单 Package 成:

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

不幸的是,我的请求主体看起来像:

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

你知道我怎么能用SpringBoot拥有这样的api吗?

cyvaqqii

cyvaqqii1#

您需要一个可以直接保存数组或对象的变量。由于java的静态类型限制,没有直接的方法可以实现这样的功能。
到目前为止,我所能想到的实现这种功能的唯一方法是创建一个采用某种泛型类型的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 {

    }
}

你得手工做很多工作。
此外,不能使用同一路径创建两个api /items 同样的方法 POST ,它们将引发编译时错误。

相关问题