解决Failed to instantiate [java.util.List]: Specified class is an interface问题

错误信息提示

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

错误信息意思:

        参数错误,参数封装出了问题。

解决方案有两种:(主要问题是第二种
第一种:将参数封装到实体中


错误时java代码解决Failed to instantiate [java.util.List]: Specified class is an interface问题_第1张图片

   前端给后台传递了一个list对象,本来以为直接用list 可以接收,但是运行方法报错,参数错误。

           查询错误问题,发现是前端传递的对象,后台没有set,get的实体接收。

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


解决办法:

将VO对象再进行封装: 

解决Failed to instantiate [java.util.List]: Specified class is an interface问题_第2张图片

换一个专门存放想要接受的实体的javaBean,定义方式如下:


解决Failed to instantiate [java.util.List]: Specified class is an interface问题_第3张图片


这样就可以接收到 从前端传递过来的 list 对象。

第二种问题:
前台js要给方法传递即传递普通参数也传递对象数组,用普通的方法定义参数中和实体封装都无法接收到对象数组List对象,参数错误
解决方法:
首先修改ajax传递参数的方式,JSON.stringify(perArr); 将数组转化成json,然后后台用字符串接受再转化格式

	//预分配
			$("#preBtn").click(function(){
				var per = 0;
				var perArr= [];
				$(".percent-input").each(function(){
					var num = $(this).val();
					if(num && num != 0){
						try{
							per += 	parseFloat(num);
							perArr.push({
								id: $(this).attr("data-id"),
								splitRate: $(this).val()
							})
						}catch(e){layer.msg("");console.log(e)}
					}
				})
				if(per !== 100){layer.msg("百分比和应为100");return;}
				
				var obj = G_data.caseList;
				console.log(obj);
				obj.userls = JSON.stringify(perArr);
				console.log(obj);
				$.ajax({
					type: "post",
					url: "/caseList/split/casePreparatorySplit",
					/* contentType: "application/json",  
					dataType: 'json',   */
					//traditional: true,
					data: obj,
					success: function(data){
						G_data.preList = data.result;
						$("#caseDetail").bootstrapTable('destroy');
						loadList(data.result);
					}
				})
				/* $.post("/caseList/split/casePreparatorySplit",obj,function(data){
					
				}) */
				
			})
controller接收方法:用string类型接收user数组对象然后用JsonUtil.readListValue(userls, User.class);转化格式为list
/**
	 * 执行自动分案预生成结果
	 *
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/split/casePreparatorySplit")
	@ResponseBody
	public Result casePreparatorySplit(HttpSession session, CaseHead caseHead, CaseParamsExtend exParams,@RequestParam String userls) throws Exception {
		if (caseHead == null){
			return new Result(1, "参数错误");
		}

		String companycode="";
		companycode = SessionUtil.getCompnayCodeFromSessionByCuishouAdminOrUser(session);
		// 查询未分配案件参数
		exParams.setAllotParam(0);//未分配的案件
		caseHead.setOnhandstatus(0);//在催的案件

		//查询用户list
		List userList=new ArrayList();
		List users = JsonUtil.readListValue(userls, User.class);

		for (int i = 0; i < users.size() ; i++) {
			User u = userService.queryUserByWhere(users.get(i));
			if (u != null){
				//将查询出来的用户放上百分比参数
				u.setSplitRate(users.get(i).getSplitRate());
				userList.add(u);
			}
		}
		List list = caseHeadService.updateAutoCaseSplit(caseHead, exParams, userList,companycode);//案件信息。分配人信息,公司编码。表名
		Result result = new Result(0, list);
		return result;
	}
  jsonUtil工具类转化类型方法

public static  List readListValue(String json, Class tClazz){
		return JSON.parseArray(json, tClazz);
	}
spring mvc 对于对象数组的接收无法用封装实体和直接在方法的接收参数上写。只能用这种方式。


谢谢观看

你可能感兴趣的:(java,常见异常及解决)