springMVC接受list报错:Could not instantiate bean class [java.util.List]: Specified class is an interf

在使用Spring MVC开发的时候,我遇到了如下的问题:

图1:错误提示

我前端用的是ExtJS框架,报错信息为:Could not instantiate bean class [java.util.List]: Specified class is an interface,如上图1所示。后来我发现是注入的问题,由于Spring在注入的时候,不允许注入一个List类型的对象,如下图2所示:

图2:错误的List注入方式

如上图2所示,这种是将一个list注入,如果这样写,会发现报图1中的错误。这个时候可以这么做,首先定义一个实体类,实体类中定义个List类型的成员属性,然后生成getter/setter方法,然后再以此作为对象注入如下图3和图4所示:

图3:实体

图4:正确的注入方式

如上所示,问题得到解决,后面我就传进来一个json数据,然后注入进去了,实例化成功了。

来自:http://yedward.net/?id=289


我的解决办法:

页面代码:

/**
 * 保存
 */
 function save(){
	//所有数据
    var data = $("#bootstrapTable").bootstrapTable("getData");

	var list = new Array();
	for (var i = 0 ; i < data.length ; i++) {
		var comparativePriceVo = {};    	
		comparativePriceVo["id"] =  i;
		comparativePriceVo["dispatchBillGoodsId"] = data[i].dispatchBillGoodsId;
		comparativePriceVo["materialCode"] =  data[i].materialCode;;
		comparativePriceVo["standardPice"] =  data[i].standardPice;;
		comparativePriceVo["unitPrice"] =  data[i].unitPrice;;
		comparativePriceVo["qualifiedAcceptCount"] =  data[i].qualifiedAcceptCount;
		
		list.push(comparativePriceVo);
	}

 
	var params = {};
	params.listJsonData = JSON.stringify(list);
	
	$.ajax({
		type: "POST",
		url: "${base}/comparativePrice/save",
		async: false,
		data: $.param( params ),
		dataType: "json",
		success: function (data) {
			if ( data.result ) {
				alert("保存成功,结果:" + data.data, '友情提示');
			}else{
				alert("网络错误:保存失败", '友情提示');
			}

		}
	});
 }

后台代码:

/**
 * 保存
 * @param list
 * @return
 */
@RequestMapping("/save")
@ResponseBody
public ResponseEntity saveComparativePriceGoods(String listJsonData) {
com.gt.core.jackson.JsonUtils.readJsonMap(listJsonData);
	List list = new ArrayList();
	list = JsonUtils.readJsonList(listJsonData, ComparativePriceVO.class);
	return ControllerHelper.returnJSONResult(true, "保存比较价物资成功", list );
}


package com.gt.util.web;

import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.ui.Model;

import com.gt.util.web.JsonResult.ErrorCode;

public class ControllerHelper {

	/**
	 * 导航到错误页面
	 * 
	 * @param model
	 * @param errorInfo
	 * @return
	 */
	public static String navErrorPage(Model model, String errorInfo) {
		model.addAttribute("errorinfo", errorInfo);
		return "error/error";
	}

	/**
	 * 返回标准JSON返回值
	 * 
	 * @param result
	 * @param message
	 * @return
	 */
	public static ResponseEntity returnJSONResult(boolean result, String message) {
		return returnJSONResult(result, message, null);
	}

	/**
	 * 返回标准JSON返回值
	 * 
	 * @param result
	 * @param message
	 * @param data
	 * @return
	 */
	public static ResponseEntity returnJSONResult(boolean result, String message, Object data) {
		return returnJSON(new JsonResult(result, message, data));
	}

	/**
	 * 返回标准JSON返回值
	 * 
	 * @param result
	 * @param errorCode
	 * @param message
	 * @param data
	 * @return
	 */
	public static ResponseEntity returnJSONResult(boolean result, ErrorCode errorCode, String message, Object data) {
		return returnJSON(new JsonResult(result, errorCode, message, data));
	}

	/**
	 * 返回给定数据的JSON格式
	 * 
	 * @param data
	 * @return
	 */
	public static  ResponseEntity returnJSON(T data) {
		HttpHeaders headers = new HttpHeaders();
		headers.setContentType(MediaType.parseMediaType(MediaType.TEXT_PLAIN + "; charset=utf-8"));
		return new ResponseEntity(data, headers, HttpStatus.OK);
	}

	/**
	 * 返回给定数据的STREAM格式(二进制)
	 * 
	 * @param data
	 * @return
	 */
	public static ResponseEntity returnData(Object data) {
		HttpHeaders headers = new HttpHeaders();
		headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
		return new ResponseEntity(data, headers, HttpStatus.OK);
	}

	public static ResponseEntity returnBadRequestData() {
		HttpHeaders headers = new HttpHeaders();
		headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
		return new ResponseEntity(null, headers, HttpStatus.BAD_REQUEST);
	}

	public static ResponseEntity returnJSONResult(boolean result, ErrorCode errorCode, String message) {
		return returnJSON(new JsonResult(result, errorCode, message, null));
	}

	/**
	 * 返回处理结果,自动封装错误提示
	 * 
	 * @param b
	 * @param javaCodeError
	 * @return
	 */
	public static ResponseEntity returnJSONResult(ErrorCode errorCode, boolean result) {
		return returnJSON(new JsonResult(result, errorCode, errorCode.getDisplay(), null));
	}
}
 
   
package com.gt.util.web;

/**
 * Json操作反馈对象
 * 
 *
 */
public class JsonResult {

	public JsonResult(boolean result) {
		this(result, null);
	}

	public JsonResult(boolean result, String message) {
		this(result, message, null);
	}

	public JsonResult(boolean result, Object data) {
		this(result, null, data);
	}

	public JsonResult(boolean result, String message, Object data) {
		this.result = result;
		this.message = message;
		this.data = data;
	}

	public JsonResult(boolean result, ErrorCode errorCode, String message,
			Object data) {
		this.result = result;
		if(errorCode!= null){
			this.errorCode = errorCode.getCode();
		}
		this.message = message;
		this.data = data;
	}

	/**
	 * 操作结果
	 */
	private boolean result;
	/**
	 * 错误代码,正确时使用0
	 */
	private int errorCode;
	private String message;
	private Object data;
	
	public boolean isResult() {
		return result;
	}

	public void setResult(boolean result) {
		this.result = result;
	}

	public String getMessage() {
		return message;
	}

	public void setMessage(String message) {
		this.message = message;
	}

	public static JsonResult createFailureResult(String message) {
		return new JsonResult(false, message);
	}

	public Object getData() {
		return data;
	}

	public void setData(Object data) {
		this.data = data;
	}

	public int getErrorCode() {
		return errorCode;
	}

	public void setErrorCode(ErrorCode errorCode) {
		this.errorCode = errorCode.getCode();
	}

	public enum ErrorCode {
		/**OK = 200*/
		NONE("", 200),
		
		/**您的登录状态已失效,请重新登录!= 401*/
		NOT_LOGIN("您的登录状态已失效,请重新登录!", 401),
		
		/**系统未查询到该数据=4041*/
		NOT_FIND_DATA("系统未查询到该数据",4041),
		
		/**对不起,安全验证失败=402*/
        NOT_VALID("对不起,安全验证失败", 402),
        
        /**可以自定义错误信息4021(如删除用户,如果该用户是管理员,可以提是管理员不能被删除)***/
        CURRENT_NOT_PERMISS_OPERATE("当前状态下不容许该操作", 4021),
        
        /**数据格式不符合要求,请重新提交! 400*/
        DATA_VALID_FAILURE("数据格式不符合要求,请重新提交!", 400),
        
        /**网络出错,请重新操作!=505*/
		JAVA_CODE_ERROR("网络出错,请重新操作!", 505),
		
		/**新增功能请下载最新版本*/
        BUSSINESS_NOT_SUPPORTED("当前客户端版本过低,不支持该功能,请下载最新版本", 600),
		
		/**对不起,您没有执行该操作的权限=403*/
		PERMISS_DENIED("对不起,您没有执行该操作的权限", 403),
		
		/**对不起,您没有操作该数据的权限!=4032*/
		PERMISS_DATA_DENIED("对不起,您没有操作该数据的权限!", 4032),
		
		/**您还没有注册公司,无法执行该操作=4031*/
		NOT_COMPANY("您还没有注册公司,无法执行该操作", 4031),
		
		/**您当前无法参与报价=4032*/
        NOT_ALLOW_QUOTATION("您当前无法参与报价", 4032),
        
        COMPANY_INFO_UN_PERFECT("企业注册信息不完整,请尽快补全:
1.请到 企业申请 中进行完善;
2.或者联系“企业管理员”进行完善。
3.信息不完整不影响正常创建操作!", 4033); private String display; private int code; // 构造方法 private ErrorCode(String display, int code) { this.display = display; this.code = code; } public int getCode() { return this.code; } public String getValue() { return name(); } public static ErrorCode fromCode(int code) { ErrorCode[] states = ErrorCode.values(); for (ErrorCode state : states) { if (state.getCode() == code) { return state; } } return null; } // 覆盖方法 @Override public String toString() { return this.display; } public String getDisplay() { return display; } } }



你可能感兴趣的:(springMVC)