采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
老师您好,我在测试商店添加的时候碰到了一个问题,导致我添加不成功并报错,
最后定位在了这里
可以看到HttpServletRequestUtil工具类中的getString方法的返回值为空,导致了68行报错,跟入之后发现其中的request.getParameter(key)取出并返回的result的值为空,于是我就跟到了前台去看
,结果我完全不知道是否已经成功的将shop转换成JSON并存入formData的shopStr中了,在右侧看shopStr也没有找到我刚刚addend进formData的shop的JSON,请问老师这种情况下该怎么排错?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | $( 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); } } }); }); }); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 | @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:这种不明显的问题解决起来有点棘手,目前还没遇到过
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 | 同学好,以下是我的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,满足工作刚需
了解课程