在使用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
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;
}
}
}