采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
老师您好,我在测试商店添加的时候碰到了一个问题,导致我添加不成功并报错,

最后定位在了这里

可以看到HttpServletRequestUtil工具类中的getString方法的返回值为空,导致了68行报错,跟入之后发现其中的request.getParameter(key)取出并返回的result的值为空,于是我就跟到了前台去看

,结果我完全不知道是否已经成功的将shop转换成JSON并存入formData的shopStr中了,在右侧看shopStr也没有找到我刚刚addend进formData的shop的JSON,请问老师这种情况下该怎么排错?

$(function () {
// 用于店铺注册时候的店铺类别以及区域列表的初始化的URL
var initUrl = '/shopadmin/getshopinitinfo';
// 注册店铺的URL
var registerShopUrl = '/shopadmin/registerShop';
getShopInitInfo();
//取得所有二级店铺类别以及区域信息,并分别赋值进类别列表以及区域列表
function getShopInitInfo() {
$.getJSON(initUrl, function(data) {
if (data.success) {
var tempHtml = "";
var tempAreaHtml = "";
// 初始化区域列表
data.shopCategoryList.map(function(item) {
tempHtml += '<option data-id="' + item.shopCategoryId
+ '">' + item.shopCategoryName + "</option>";
});
data.areaList.map(function(item) {
tempAreaHtml += '<option data-id="' + item.areaId + '">'
+ item.areaName + "</option>";
});
$("#shop-category").html(tempHtml);
$("#area").html(tempAreaHtml);
}
});
}
$("#submit").click(function () {
// 创建shop对象
var shop = {};
// 获取表单里的数据并填充进对应的店铺属性中
shop.shopName = $("#shop-name").val();
shop.shopAddr = $("#shop-addr").val();
shop.phone = $("#shop-phone").val();
shop.shopDesc = $("#shop-desc").val();
// 选择选定好的店铺类别
shop.shopCategory = {
shopCategoryId : $("#shop-category").find("option").not(function() {
return !this.selected;
}).data("id")
};
// 选择选定好的区域信息
shop.area = {
areaId : $("#area").find("option").not(function() {
return !this.selected;
}).data("id")
};
// 获取上传的图片文件流
var shopImg = $("#shop-img")[0].files[0];
// 生成表单对象,用于接收参数并传递给后台
var formData = new FormData();
// 添加图片流进表单对象里
formData.append("shopImg", shopImg);
// 将shop json对象转成字符流保存至表单对象key为shopStr的的键值对里
var shopJSON = JSON.stringify(shop);
alert(shopJSON);
formData.append("shopStr", JSON.stringify(shop));
// 将数据提交至后台处理相关操作
$.ajax({
url : registerShopUrl,
type : "POST",
data : formData,
contentType : false,
processData : false,
cache : false,
success : function(data) {
if (data.success) {
$.toast("提交成功!");
} else {
$.toast("提交失败!" + data.errMsg);
}
}
});
});
});
@RequestMapping(value = "/registerShop", method = RequestMethod.POST)
@ResponseBody
private Map<String, Object> registerShop(HttpServletRequest request) {
//返回对象,modelMap存储成功或错误信息
Map<String, Object> modelMap = new HashMap<String, Object>();
//1.接收并转化相应的参数,包括店铺信息以及图片信息
String shopStr = request.getParameter("shopStr");
//String shopStr = HttpServletRequestUtil.getString(request, "shopStr");
//jackson实体类
ObjectMapper mapper = new ObjectMapper();
Shop shop = null;
try {
//1-1使用jackson将接受的参数转换成实体类
shop = mapper.readValue(shopStr, Shop.class);
} catch (IOException e) {
//异常返回
modelMap.put("success", false);
modelMap.put("errMsg", e.toString());
return modelMap;
}
//1-2处理图片信息
//spring自带对象用来存储上传文件的CommonsMultipartFile
CommonsMultipartFile shopImg = null;
//CommonsMultipartResolver :一个多分解的容器
//request.getSession().getServletContext():获取当前会话的上下文中上传的文件内容
CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver(
request.getSession().getServletContext());
//如果不为空的话
if (commonsMultipartResolver.isMultipart(request)) {
//将整个request放进容器里变成多部分request
MultipartHttpServletRequest multipartHttpServletRequest = (MultipartHttpServletRequest) request;
//取出容器中前台命名为shopImg的文件流放入shopImg,这样就取得了上传的文件
shopImg = (CommonsMultipartFile) multipartHttpServletRequest.getFile("shopImg");
} else {
//失败返回
modelMap.put("success", false);
modelMap.put("errMsg", "上传不能为空");
return modelMap;
}
//转换shopImg格式为file
//声明一个空file文件用于转换shopImg
File shopImgFile = new File(PathUtil.getImgBasePath() + ImageUtil.getRandomFileName());
try {
//创建空文件
shopImgFile.createNewFile();
} catch (IOException e) {
//异常返回
modelMap.put("success", false);
modelMap.put("errMsg", "上传不能为空");
return modelMap;
}
//2.注册店铺
if (shop != null && shopImg != null) {
PersonInfo owner = new PersonInfo();
//Session TODO
owner.setUserId(1L);
shop.setOwner(owner);
ShopExecution se;
try {
se = shopService.addShop(shop, shopImg.getInputStream(), shopImg.getOriginalFilename());
} catch (IOException e) {
//异常返回
modelMap.put("success", false);
modelMap.put("errMsg", "上传不能为空");
return modelMap;
}
if (se.getState() == ShopStateEnum.CHECK.getState()) {
//成功返回
modelMap.put("success", true);
modelMap.put("errMsg", se.getStateInfo());
} else {
//失败返回
modelMap.put("success", false);
modelMap.put("errMsg", "请输入店铺信息");
return modelMap;
}
return modelMap;
} else {
//失败返回
modelMap.put("success", false);
modelMap.put("errMsg", "请输入店铺信息");
return modelMap;
}
}同学好,代码看起来是没有问题的,这个问题比较难判断,因为代码我这边没办法去执行,所以从经验判断,如果代码没问题,那么很有可能是两处中的一处有问题: 第一处是content-type 第二处是编码问题 具体可以参阅 http://blog.csdn.net/fs1360472174/article/details/44727159 针对第一种问题,同学可以看看content-type是否为application/x-www-form-urlencoded,可以在chrome开发者模式请求头header里查询 针对第二种问题,同学可以右键js文件通过属性查看js文件的编码,并且右键controller文件,通过属性查看controller文件的编码,两者保持utf8 此外,同学也可以清除下浏览器缓存再试试,还有可能是缓存问题:) PS:这种不明显的问题解决起来有点棘手,目前还没遇到过
同学好,以下是我的js部分的代码,这个问题一般需要debug看看shop是否有值,同时再看formData里的shopStr是否有值,之后再看看跟后台对接的method type之类是否正确:)
/**
*
*/
$(function() {
// 从URL里获取shopId参数的值
var shopId = getQueryString('shopId');
// 由于店铺注册和编辑使用的是同一个页面,
// 该标识符用来标明本次是添加还是编辑操作
var isEdit = shopId ? true : false;
// 用于店铺注册时候的店铺类别以及区域列表的初始化的URL
var initUrl = '/o2o/shopadmin/getshopinitinfo';
// 注册店铺的URL
var registerShopUrl = '/o2o/shopadmin/registershop';
// 编辑店铺前需要获取店铺信息,这里为获取当前店铺信息的URL
var shopInfoUrl = "/o2o/shopadmin/getshopbyid?shopId=" + shopId;
// 编辑店铺信息的URL
var editShopUrl = '/o2o/shopadmin/modifyshop';
// 判断是编辑操作还是注册操作
if (!isEdit) {
getShopInitInfo();
} else {
getShopInfo(shopId);
}
// 通过店铺Id获取店铺信息
function getShopInfo(shopId) {
$.getJSON(shopInfoUrl, function(data) {
if (data.success) {
// 若访问成功,则依据后台传递过来的店铺信息为表单元素赋值
var shop = data.shop;
$('#shop-name').val(shop.shopName);
$('#shop-addr').val(shop.shopAddr);
$('#shop-phone').val(shop.phone);
$('#shop-desc').val(shop.shopDesc);
// 给店铺类别选定原先的店铺类别值
var shopCategory = '<option data-id="'
+ shop.shopCategory.shopCategoryId + '" selected>'
+ shop.shopCategory.shopCategoryName + '</option>';
var tempAreaHtml = '';
// 初始化区域列表
data.areaList.map(function(item, index) {
tempAreaHtml += '<option data-id="' + item.areaId + '">'
+ item.areaName + '</option>';
});
$('#shop-category').html(shopCategory);
// 不允许选择店铺类别
$('#shop-category').attr('disabled', 'disabled');
$('#area').html(tempAreaHtml);
// 给店铺选定原先的所属的区域
$("#area option[data-id='" + shop.area.areaId + "']").attr(
"selected", "selected");
}
});
}
// 取得所有二级店铺类别以及区域信息,并分别赋值进类别列表以及区域列表
function getShopInitInfo() {
$.getJSON(initUrl, function(data) {
if (data.success) {
var tempHtml = '';
var tempAreaHtml = '';
data.shopCategoryList.map(function(item, index) {
tempHtml += '<option data-id="' + item.shopCategoryId
+ '">' + item.shopCategoryName + '</option>';
});
data.areaList.map(function(item, index) {
tempAreaHtml += '<option data-id="' + item.areaId + '">'
+ item.areaName + '</option>';
});
$('#shop-category').html(tempHtml);
$('#area').html(tempAreaHtml);
}
});
}
// 提交按钮的事件响应,分别对店铺注册和编辑操作做不同响应
$('#submit').click(function() {
// 创建shop对象
var shop = {};
if (isEdit) {
// 若属于编辑,则给shopId赋值
shop.shopId = shopId;
}
// 获取表单里的数据并填充进对应的店铺属性中
shop.shopName = $('#shop-name').val();
shop.shopAddr = $('#shop-addr').val();
shop.phone = $('#shop-phone').val();
shop.shopDesc = $('#shop-desc').val();
// 选择选定好的店铺类别
shop.shopCategory = {
shopCategoryId : $('#shop-category').find('option').not(function() {
return !this.selected;
}).data('id')
};
// 选择选定好的区域信息
shop.area = {
areaId : $('#area').find('option').not(function() {
return !this.selected;
}).data('id')
};
// 获取上传的图片文件流
var shopImg = $('#shop-img')[0].files[0];
// 生成表单对象,用于接收参数并传递给后台
var formData = new FormData();
// 添加图片流进表单对象里
formData.append('shopImg', shopImg);
// 将shop json对象转成字符流保存至表单对象key为shopStr的的键值对里
formData.append('shopStr', JSON.stringify(shop));
// 获取表单里输入的验证码
var verifyCodeActual = $('#j_captcha').val();
if (!verifyCodeActual) {
$.toast('请输入验证码!');
return;
}
formData.append('verifyCodeActual', verifyCodeActual);
// 将数据提交至后台处理相关操作
$.ajax({
url : (isEdit ? editShopUrl : registerShopUrl),
type : 'POST',
data : formData,
contentType : false,
processData : false,
cache : false,
success : function(data) {
if (data.success) {
$.toast('提交成功!');
if (!isEdit) {
// 若为注册操作,成功后返回店铺列表页
window.location.href = "/o2o/shopadmin/shoplist";
}
} else {
$.toast('提交失败!' + data.errMsg);
}
// 点击验证码图片的时候,注册码会改变
$('#captcha_img').click();
}
});
});
})
登录后可查看更多问答,登录/注册
SSM商铺V1.0,解决毕设痛点;SpringBoot商铺V2.0,满足工作刚需
了解课程