使用SpringMVC訪問(wèn)Controller接口返回400BadRequest
訪問(wèn)Controller返回400BadRequest
問(wèn)題
SpringMVC使用自定義類型接收參數(shù)時(shí), form提交會(huì)返回400 Bad Request,controller接口里的方法沒(méi)有得到調(diào)用。
@RequestMapping(value = "/list.do", method = {RequestMethod.GET , RequestMethod.POST})
? ? public String list(Order param, HttpServletRequest request) {
? ? ? ? logger.info(JSONObject.fromObject(param).toString());
? ? ? ? Integer count = orderService.findCount(param);
? ? ? ? logger.info(count);
? ? ? ? param.setRows(count);
? ? ? ? List<Order> result = orderService.findByPage(param);
? ? ? ? logger.info(JSONArray.fromObject(result).toString());
? ? ? ? request.setAttribute("param", param);
? ? ? ? request.setAttribute("result", result);
? ? ? ? return "order/list";
? ? }? ? <form action="<%=basePath%>order/list.do" id="myform" method="post" >
? ? ? ? <input type="hidden" name="currentPage" value="${param.currentPage}"/>
? ? ? ? <table>
? ? ? ? ? ? <tr>
? ? ? ? ? ? ? ? <td width="80" align="right">訂單狀態(tài): </td>
? ? ? ? ? ? ? ? <td>
? ? ? ? ? ? ? ? ? ? <select name="order_status" autoWidth="true" style="width:120px;">
? ? ? ? ? ? ? ? ? ? ? ? <option value="">全部</option>
? ? ? ? ? ? ? ? ? ? ? ? <c:forEach items="${order_status_map}" var="temp">
? ? ? ? ? ? ? ? ? ? ? ? ? ? <option value="${temp.key}" <c:if test="${temp.key == param.order_status}">selected="selected"</c:if>>${temp.value}</option>
? ? ? ? ? ? ? ? ? ? ? ? </c:forEach>
? ? ? ? ? ? ? ? ? ? </select>
? ? ? ? ? ? ? ? </td>
? ? ? ? ? ? ? ? <td align="right">訂單號(hào): </td>
? ? ? ? ? ? ? ? <td>
? ? ? ? ? ? ? ? ? ? <input type="text" name="order_no" id="order_no" onfocus="this.value=''" value="${param.order_no}" style="width:140px;"/>
? ? ? ? ? ? ? ? </td>
? ? ? ? ? ? </tr>
? ? ? ? ? ? <tr>
? ? ? ? ? ? ? ? <td width="80" align="right">創(chuàng)建時(shí)間: </td>
? ? ? ? ? ? ? ? <td><input type="text" class="date" name="createTimeStart" value="${param.createTimeStart}" style="width:120px;"/></td>
? ? ? ? ? ? ? ? <td align="center"> 至 </td>
? ? ? ? ? ? ? ? <td><input type="text" class="date" name="createTimeEnd" ?value="${param.createTimeEnd}" style="width:120px;"/></td>
? ? ? ? ? ? ? ? <td><button><span class="icon_find">查詢</span></button></td>
? ? ? ? ? ? ? ? <td><button onclick="add();return false;"><span class="icon_add">添加</span></button></td>
? ? ? ? ? ? </tr>
? ? ? ? </table>
? ? </form>直接在瀏覽器地址欄輸入<%=basePath%>order/list.do是可以訪問(wèn)的并查詢出數(shù)據(jù)的,我一開(kāi)始以為是get方法能訪問(wèn),post不能訪問(wèn),后來(lái)發(fā)現(xiàn),get使用Context-Type為application/x-www-form-urlencoded時(shí)也會(huì)訪問(wèn)不了,post使用使用application/json也能訪問(wèn)。
所以,這就需要修改form里的enctype屬性為application/json,但是enctype屬性只支持下面表格三種,
HTML form 標(biāo)簽的 enctype 屬性
| 值 | 描述 |
|---|---|
| application/x-www-form-urlencoded | 在發(fā)送前編碼所有字符(默認(rèn)) |
| multipart/form-data | 不對(duì)字符編碼。在使用包含文件上傳控件的表單時(shí),必須使用該值。 |
| text/plain | 空格轉(zhuǎn)換為 “+” 加號(hào),但不對(duì)特殊字符編碼。 |
我試了下,text/plain和application/json具有同樣的效果。
雖然在form里加上enctype=”text/plain”可以解決接口返回400BadRequest的問(wèn)題,但是有新的問(wèn)題出現(xiàn):接口的參數(shù)Order param接受不到post提交的值,但是將參數(shù)直接拼接在url,Order param則可以接收到值,Order param
SpringMVC遇到的Http400BadRequest總結(jié)
在搭建SpringMVC環(huán)境,在使用中遇到了多次Bad Request的連接
下面來(lái)總結(jié)下
1.參數(shù)類型不對(duì),如后臺(tái)實(shí)體類的屬性為int,但傳來(lái)的參數(shù)為字符串
2.因?yàn)槲业拇中模緛?lái)是要通過(guò)Ajax獲得一個(gè)json串,但是后臺(tái)的方法在返回值類型前沒(méi)有加@RequestBody注解
3.傳遞的參數(shù)為日期,spring不知道該以什么格式轉(zhuǎn)換為Date類型,解決辦法為在實(shí)體類的日期屬性上加上@DateTimeFormat(pattern="yyyy-MM-dd")注解即可
4.剛遇到的問(wèn)題,排查了好久終于知道是什么原因了,實(shí)體類中有int類型的屬性,但是前臺(tái)傳參時(shí)傳遞的樣子是這樣的"age=",并沒(méi)有給一個(gè)準(zhǔn)確的數(shù)字(age=18),所以導(dǎo)致Spring在對(duì)int型屬性進(jìn)行賦值時(shí)無(wú)法正確賦值
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
詳解Java ES多節(jié)點(diǎn)任務(wù)的高效分發(fā)與收集實(shí)現(xiàn)
ElasticSearch 是一個(gè)高可用開(kāi)源全文檢索和分析組件。提供存儲(chǔ)服務(wù),搜索服務(wù),大數(shù)據(jù)準(zhǔn)實(shí)時(shí)分析等。一般用于提供一些提供復(fù)雜搜索的應(yīng)用2021-06-06
Java藍(lán)橋杯實(shí)現(xiàn)線段和點(diǎn)
本文主要介紹Java藍(lán)橋杯實(shí)現(xiàn)線段和點(diǎn)的內(nèi)容,感興趣的小伙伴可以參考下文2021-08-08
Java調(diào)用打印機(jī)的2種方式舉例(無(wú)驅(qū)/有驅(qū))
我們平時(shí)使用某些軟件或者在超市購(gòu)物的時(shí)候都會(huì)發(fā)現(xiàn)可以使用打印機(jī)進(jìn)行打印,這篇文章主要給大家介紹了關(guān)于Java調(diào)用打印機(jī)的2種方式,分別是無(wú)驅(qū)/有驅(qū)的相關(guān)資料,需要的朋友可以參考下2023-11-11
登陸驗(yàn)證碼kaptcha結(jié)合spring boot的用法詳解
在一個(gè)web應(yīng)用中驗(yàn)證碼是一個(gè)常見(jiàn)的元素。不管是防止機(jī)器人還是爬蟲(chóng)都有一定的作用,下面這篇文章主要給大家介紹了登陸驗(yàn)證碼kaptcha結(jié)合spring boot用法的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-06-06
Spring boot啟動(dòng)流程之解決循環(huán)依賴的方法
循環(huán)依賴,指的是兩個(gè)bean之間相互依賴,形成了一個(gè)循環(huán),spring解決循環(huán)依賴的方式是在bean的實(shí)例化完成之后,所以不要在構(gòu)造方法中引入循環(huán)依賴,因?yàn)檫@時(shí)對(duì)象還沒(méi)有實(shí)例化,spring也無(wú)法解決,本文給大家介紹Spring boot循環(huán)依賴的解決方法,一起看看吧2024-02-02
啟動(dòng)springboot項(xiàng)目時(shí)報(bào)錯(cuò):無(wú)法訪問(wèn)org.springframework.web.bind.annotatio
這篇文章給大家分享了啟動(dòng)springboot項(xiàng)目時(shí)報(bào)錯(cuò):?無(wú)法訪問(wèn)org.springframework.web.bind.annotation.GetMapping …具有錯(cuò)誤的版本 61.0,應(yīng)為52.0?的解決方案,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-10-10
Java RSA加密解密實(shí)現(xiàn)方法分析【附BASE64 jar包下載】
這篇文章主要介紹了Java RSA加密解密實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了java基于第三方類庫(kù)javabase64-1.3.1.jar實(shí)現(xiàn)RSA加密解密功能的具體步驟與相關(guān)操作技巧,需要的朋友可以參考下2017-10-10

