Spring MVC传递List类型参数报错:No primary or default constructor found for interface java.util.List]使用两种注解解决

  • 在测试GenericConverter传递List数组的时候,出现No primary or default constructor found for interface java.util.List] with r这个错误
  • 解决
  1. 因为报错是500所以肯定是后端的问题,看一下报错记录
This application has no explicit mapping for /error, so you are seeing this as a fallback.

Tue Apr 21 18:27:57 CST 2020
There was an unexpected error (type=Internal Server Error, status=500).
No primary or default constructor found for interface java.util.List
  1. 再看控制台报错
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.IllegalStateException: No primary or default constructor found for interface java.util.List] with root cause
  1. 简便一下
Request processing failed
  1. 请求处理失败,具体的失败是后面:No primary or default constructor found for interface java.util.List] with root cause
    因为是在自定义数组转换器的时候失败的,所以我还是去自定义转换器那里加了一个断点,发现不是在参数转换过程中失败。

  2. 所以应该是处理器处理参数之前的步骤出错了。确定处理器之前的步骤就是HandlerMapping进行请求与@RequestMapping的匹配了。
    那么就可能不是一个单例,而是可能是一个普遍性问题,我们去掉自定义转化器,写一个简单的控制器

    @GetMapping("/no/list")
    @ResponseBody
    public List<String> lists(  List<String> strs){
        return strs;
    }

结果:

This application has no explicit mapping for /error, so you are seeing this as a fallback.

Tue Apr 21 18:42:29 CST 2020
There was an unexpected error (type=Internal Server Error, status=500).
No primary or default constructor found for interface java.util.List

哈哈哈,说明这是一个一般性的问题。

  1. 那就咱进一步,因为获取控制器参数是在进入控制器方法之前(因为需要转换成控制器所需要的参数),所以肯定是在获取控制器参数之前。
    那就是处理器映射过程中的问题了。
    处理器映射需要把请求路径与@RequestMapping匹配,现在看来这个过程还需要对参数进行映射。

  2. 但是我突然想到无注解之下SPring MVC获取参数的唯一要求是参数名称与Http请求参数名称保持一致,一般的List参数简单的用逗号隔开就可以了,不会有所谓的名称,那就可能是这样导致的。
    那我加上名称试一试

http://localhost:8243/role/no/list?strs=1,2,3

还是报错

  1. 原谅我这个时候又想到一点,逗号隔开是数组的默认传递方式,不是list啊
    也就是名称匹配但是,但是目标对象不匹配。
    那就试试改成数组
    @GetMapping("/no/array")
    @ResponseBody
    public String[] lists(  String[] strs){
        return strs;
    }

结果是可以的
9. 所以我暂时给他定一个结论,就是不匹配
那就用@RequestParam让他强制匹配

    @GetMapping("/no/list")
    @ResponseBody
    public List<String> lists(  @RequestParam List<String> strs){
        return strs;
    }

可以了!!!!!!
10. 嘿嘿,那么我的问题就解决了,不过List还是使用JSON传递的比较多
所以在试一试@RequestBody,但是我不会写这种前端的,再等前端抽一个例子给我

### 回答1: 这个错误是因为在使用Java中的List接口时,没有找到主要或默认的构造函数。List是一个接口,不能直接实例化,需要使用其实现类(如ArrayList、LinkedList等)来创建List对象。在创建List对象时,需要使用实现类的构造函数来初始化List对象。如果没有使用正确的构造函数,就会出现这个错误。 ### 回答2: 这个错误的具体含义是没有找到java.util.list这个接口的主构造函数或默认构造函数。在Java编程中,一个类必须要有构造函数才能被实例化。构造函数是一个特殊的方法,用于在创建对象时初始化对象的各个成员变量。 然而,接口没有成员变量,也没有构造函数。它只提供了一些方法的声明。因此,不能直接创建一个接口的实例。通常我们使用实现该接口的类来创建对象。 在这种情况下,错误的原因可能是尝试使用List接口来创建一个对象,而不是使用实现List接口的类来创建对象。例如: List<Integer> myList = new List<Integer>(); //错误的写法 正确的做法是使用实现List接口的类来创建对象,例如: List<Integer> myList = new ArrayList<Integer>(); 如果您仍然使用List接口而不是实现它的类来创建对象,您需要更改代码以使用正确的类。否则,这个错误将继续出现并且您的程序将无法工作。 ### 回答3: 这个错误通常出现在使用反射机制创建一个接口的实例时。在Java中,接口无法被实例化,因为它们没有具体的实现,只有定义。当使用反射机制创建接口实例时,Java运行时系统会试图查找默认构造函数(即没有参数的公共构造函数),但接口没有默认构造函数,所以会抛出IllegalStateException异常。 解决这个问题的方法是通过实现这个接口来创建一个对象。可以通过使用ArrayList等实现了List接口的具体类来实现List接口,然后创建一个List对象。例如: ``` List<String> myList = new ArrayList<>(); ``` 这样就不会出现这个错误了,因为ArrayList类有一个默认构造函数。当然,如果在需要用到接口时需要创建自己的类,则需要提供一个public构造函数,以便Java运行时系统可以使用它。 总之,Java.lang.IllegalStateException:no primary or default constructor found for interface java.util.List是因为尝试创建一个接口的实例,而接口无法直接实例化。正确的方法是使用实现了接口的具体类来创建对象,或提供一个public构造函数,以便Java运行时系统可以使用它。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值