zoukankan      html  css  js  c++  java
  • Failed to instantiate [java.util.List]: Specified class is an interface

    错误信息提示:

    Failed to instantiate [java.util.List]: Specified class is an interface;

    错误信息意思:参数错误,参数封装出了问题。

    原因:

    前端给后台传递了一个list对象,本来以为直接用list 可以接收,但是运行方法报错,参数错误。查询错误问题,发现是前端传递的对象,后台没有set,get的实体接收。

    controller中参数List内封装的不是基本数据类型,而是一个对象,springMVC源码获取前台的参数是:request.getParameter(" ")来接收参数的,这样的话,封装参数时就出问题了。

    解决办法:

    第一种方法:

    将VO对象再进行封装。

    import java.util.List;  
      
    public class ConfigListForm {  
      
        private List<Config> ConfigList;  
      
          
        public List<<span style="font-family:Arial, Helvetica, sans-serif;">Config</span>> getConfigList() {  
            return ConfigList;  
        }  
      
          
        public void setConfigList(List<Config> configList) {  
            ConfigList = configList;  
        }  
    }  
    

      

    缺陷:

    这种方式不好处理接收的数据。我想接受的数据是config对象的数组,但是接收的数据是:[{configName=111, configId=111},{configName=222, =222}],不能自动封装到我的对象里,没有把configName,configId,封装到Config对象中。

    第二种方法:

    可以把数组序列化成Json字符串提交,后台springmvc里用@ RequestBody String 方式接收,然后把这个接收到的json串用json工具转换为数组,这样就解决了springmvc不能绑定对象数组的问题了。

    将对象数组用{"list":JSON.stringify(array)}绑定到后台,后台用@RequestBody String configs接收,接收的是json数据,然后用jackson把configs转为数组List<configs> configList。

    <span style="font-family:'宋体', Arial, Helvetica, 'san-serif';">var configList= JSON.stringify([      
                {configName: "sgs-demo", configId: "1"},      
                {configName: "sgs-demo-1", configId: "2"}      
            ]);    
        
            $.ajax({      
                type: "post",     
                url: "/config",     
                data:</span><span style="font-family:SimSun;"><span style="font-size:14px;line-height:25.2px;background-color:rgb(250,250,250);">c</span><span style="font-size:14px;line-height:25.2px;background-color:rgb(250,250,250);">onfigs</span></span><span style="font-family:'宋体', Arial, Helvetica, 'san-serif';"> ,      
                contentType: "application/json; charset=utf-8",      
                dataType: "json",      
                success: function (response, ifo) {      
                    alert("success");      
                }, error: function () {      
                    alert("error");      
                }      
            })   </span>  
    

      

    dataType:'json',//预期的服务器响应的数据类型。

    contentType: "application/json; charset=utf-8",//发送数据到服务器时所使用的内容类型。默认是:"application/x-www-form-urlencoded"。

    如果不加contentType,configs接收的数据为类似%7B%22id%22%3A243%2C%name%22%3A4%2C%22age%22%3A1048%2C%22格式,json转换会报错,

    controller层

    @RequestMapping(value = "/config", method = RequestMethod.POST)      
        public  void myDomain(HttpServletRequest request, @RequestBody String configs) throws Exception{    
                
            ObjectMapper objectMapper = new ObjectMapper();    
            JavaType javaType = objectMapper.getTypeFactory().constructParametricType(List.class, configs.class);    
            List<configs> list = objectMapper.readValue(configs, javaType);    
            
            System.out.println("");      
        }   
    

      第三种方法:spring3.2 直接支持泛型集合

    spring 3.2 直接支持泛型集合,如List<Sample> Map<String, Sample>等集合泛型

    具体步骤

    1 要配置驱动注解<mvc:annotation-driven/> ,里面注册了会把json绑定到list的"Bean实例"。

    2 前台传json数组,后台直接@RequestBody List<Config> list接收就可以。

    (这种方法还没测试过,只是在查这个问题的时候看到这种方式。)

  • 相关阅读:
    kafka源码学习笔记
    spring学习笔记
    logback pattern配置详解
    hive笔记
    hbase笔记
    打监控的坑
    Consul1 在window7安装
    springboot1.4下hystrix dashboard Unable to connect to Command Metric Stream解决办法
    com.netflix.hystrix.contrib.javanica.exception.FallbackDefinitionException: fallback method wasn't found: serviceError([class java.lang.String]) 异常
    Keepalived 集群在Linux下的搭建
  • 原文地址:https://www.cnblogs.com/charlypage/p/8847021.html
Copyright © 2011-2022 走看看