解決Failed to instantiate [java.util.List]: Specified class is an interface問題
阿新 • • 發佈:2019-01-03
錯誤資訊提示
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,然後後臺用字串接受再轉化格式controller接收方法:用string型別接收user陣列物件然後用JsonUtil.readListValue(userls, User.class);轉化格式為list<user>//預分配 $("#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){ }) */ })
jsonUtil工具類轉化型別方法/** * 執行自動分案預生成結果 * * @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; }
public static <T> List<T> readListValue(String json, Class<T> tClazz){
return JSON.parseArray(json, tClazz);
}
spring mvc 對於物件陣列的接收無法用封裝實體和直接在方法的接收引數上寫。只能用這種方式。謝謝觀看