无法实例化[java.util.List]:指定的类是GET请求中的接口

时间:2018-08-17 09:07:55

标签: java spring list rest spring-boot

在我的Spring Boot REST API应用程序中,我需要通过接受强类型列表作为输入来处理HTTP GET

@RestController
public class CusttableController {

    @RequestMapping(value="/custtable", method=RequestMethod.GET)
    public List<MyObject> getCusttableRecords(List<Custtable> customers) {...}

这给了我这个错误:

  

org.springframework.beans.BeanInstantiationException:无法实例化[java.util.List]:指定的类是接口

GET请求中,我在Spring Boot中接受强类型列表的正确方法是什么?

5 个答案:

答案 0 :(得分:3)

添加注释@RequestBody,该注释表示该参数已绑定到HTTP请求的正文。

另一件事是HTTP方法GET方法不包含请求正文,因此@RequestBody将被忽略。将方法更改为POST

@RequestMapping(value="/custtable", method=RequestMethod.POST)
public List<MyObject> getCusttableRecords(@RequestBody List<Custtable> customers) {
    // ...
}

从Spring 4.3开始,您可以使用@PostMapping

@PostMapping(value="/custtable")
public List<MyObject> getCusttableRecords(@RequestBody List<Custtable> customers) {
    // ...
}

尽管根据REST原理,应该使用POST方法来创建新资源:

  

请求URI处的资源对提供的实体执行某些操作。 POST通常用于创建新实体,但也可以用于更新实体。

但是,这是唯一的解决方法,因为您的请求有点不寻常。我建议您将List更改为其他任何内容,并且更简单地将其作为URL的一部分通过@RequestParam进行传递。例如,您可能只需要这些对象的ID。然后,您可以使用GET

@RequestMapping(value="/cuttable", method=RequestMethod.GET)
public List<MyObject> getCusttableRecords(@RequestParam List<String> id) {
    // ...
}

URL看起来像:

localhost:8080/cuttable?id=1&id=2&id=3

答案 1 :(得分:1)

您需要将@RequestBody添加到客户参数,并使用POST而不是GET。

@RestController
public class CusttableController {

    @RequestMapping(value="/custtable", method=RequestMethod.POST)
    public List<MyObject> getCusttableRecords(@RequestBody List<Custtable> customers) {...}

如果您仍然想使用GET方法,则可以执行以下操作:

@RestController
public class CusttableController {

    @RequestMapping(value="/custtable", method=RequestMethod.GET)
    public List<MyObject> getCusttableRecords(@RequestParam(name = "chooseAnAlias") List<Custtable> customers) {...}

,然后按以下方式拨打电话:

domain.com/custtable?chooseAnAlias=value1&chooseAnAlias=value2&.. chooseAnAlias = valueN

答案 2 :(得分:0)

尝试一下。

public List<MyObject> getCusttableRecords(@RequestBody List<Custtable> customers) {...}

您需要使用@RequestBody

答案 3 :(得分:0)

您不应发送带有GET请求的请求正文。如果必须发送,请将请求方法更改为POST

@RestController
public class CusttableController {

    @RequestMapping(value="/custtable", method=RequestMethod.POST)
    public List<MyObject> getCusttableRecords(@RequestBody List<Custtable> customers) {...}
}

答案 4 :(得分:0)

您需要使用@RequestBody和contentType:“ application / json”