1. 程式人生 > >解決Failed to instantiate [java.util.List]: Specified class is an interface問題

解決Failed to instantiate [java.util.List]: Specified class is an interface問題

錯誤資訊提示

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

錯誤資訊意思:

        引數錯誤,引數封裝出了問題。

解決方案有兩種:(主要問題是第二種
第一種:將引數封裝到實體中

錯誤時java程式碼

   前端給後臺傳遞了一個list物件,本來以為直接用list 可以接收,但是執行方法報錯,引數錯誤。

           查詢錯誤問題,發現是前端傳遞的物件,後臺沒有set,get的實體接收。

controller中引數List內封裝的不是基本資料型別,而是一個物件,springMVC原始碼獲取前臺的引數是:request.getParameter("")來接收引數的,這樣的話,封裝引數時就出問題了。

解決辦法:

將VO物件再進行封裝: 


換一個專門存放想要接受的實體的javaBean,定義方式如下:


這樣就可以接收到 從前端傳遞過來的 list<Attachment> 物件。

第二種問題:
前臺js要給方法傳遞即傳遞普通引數也傳遞物件陣列,用普通的方法定義引數中和實體封裝都無法接收到物件陣列List<User>物件,引數錯誤
解決方法:
首先修改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<user>
/**
	 * 執行自動分案預生成結果
	 *
	 * @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<User> userList=new ArrayList<User>();
		List<User> 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<User> list = caseHeadService.updateAutoCaseSplit(caseHead, exParams, userList,companycode);//案件資訊。分配人資訊,公司編碼。表名
		Result result = new Result(0, list);
		return result;
	}
  jsonUtil工具類轉化型別方法
public static <T> List<T> readListValue(String json, Class<T> tClazz){
		return JSON.parseArray(json, tClazz);
	}
spring mvc 對於物件陣列的接收無法用封裝實體和直接在方法的接收引數上寫。只能用這種方式。


謝謝觀看