前后台传参类型、格式不同,解决思路
思路:
找類型轉(zhuǎn)換類工具、格式轉(zhuǎn)換類工具。
(1)可能需要寫在控制層,那就需要使用@InitBinder注解,優(yōu)先加載其中內(nèi)容;(更好,更完善的方法:將這些方法寫在BaseController類中(可以自己建個(gè)工具類),需要進(jìn)行這類轉(zhuǎn)換的控制器只需繼承BaseController即可)
(2)可能需要用在get方法上面,需要使用相應(yīng)注解,使參數(shù)進(jìn)get之前,先進(jìn)工具類進(jìn)行處理。再進(jìn)入get。
例子:
(1)從前臺(tái)表單所獲取的數(shù)據(jù)的時(shí)間格式與后臺(tái)所能處理的時(shí)間格式不同,而springMVC不能自動(dòng)轉(zhuǎn)換,需要手動(dòng)定義轉(zhuǎn)換。
具體問題:在swagger頁面中修改、添加數(shù)據(jù)后,若時(shí)間填寫2118-8-8這種格式,則報(bào)400狀態(tài)碼(無法理解請(qǐng)求的參數(shù))。若改成2018/8/8這種形式,則可以成功寫庫。
解決方法:
//將后臺(tái)所能處理的日期格式從2018/8/8變成了2018-8-8 @InitBinderprotected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) {SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");simpleDateFormat.setLenient(false);CustomDateEditor dateEditor = new CustomDateEditor(simpleDateFormat, true);binder.registerCustomEditor(Date.class,dateEditor);}@ApiOperation(value = "更新人員")@ApiResponses(value = {@ApiResponse(code = 200, message = "updated")})@ApiImplicitParam(name="ryid",paramType="path",dataType="string",value="人員ID",required = true)@RequestMapping(value="update/{ryid}",method=RequestMethod.PUT)public void update(@PathVariable("ryid") String ryid,@ModelAttribute Ryb ryb){ryb.setRyid(ryid);rybService.update(ryid,HtglRybFactory.create(ryb));}@ApiOperation( "創(chuàng)建人員")@ApiResponses(value = {@ApiResponse(code = 201, message = "Created")})@RequestMapping(value="add",method=RequestMethod.POST)public void add( @ModelAttribute Ryb ryb ){if( rybService.add(HtglRybFactory.create(ryb)) != null ) {response.setStatus(HttpStatus.CREATED.value());}}說明:
1)在控制層中方法之前添加粉色處代碼。即可。(會(huì)優(yōu)先注冊(cè)這個(gè)編輯器)
2)效果:后臺(tái)能處理2118-8-8這種格式。但不能處理2018/8/8這種形式。
3)處理問題的思維歷程:通過debug找到問題的具體位置,鎖定具體原因。
如本例,在黃色熒光處打了斷點(diǎn),發(fā)現(xiàn)在swagger添加、修改操作時(shí),沒被斷點(diǎn)攔截就已經(jīng)報(bào)錯(cuò)。鎖定了數(shù)據(jù)沒傳過來的問題。同時(shí),若不填寫時(shí)間數(shù)據(jù),則添加、修改可以成功。鎖定問題是時(shí)間格式問題。
*優(yōu)化:(目標(biāo):無論輸入2118-8-8這種格式,還是2018/8/8這種形式,均能成功寫庫)
創(chuàng)建工具類,如下
public class BaseController {@InitBinderprotected void initBinder(WebDataBinder binder) {binder.registerCustomEditor(Date.class, new MyDateEditor());}private class MyDateEditor extends PropertyEditorSupport {@Overridepublic void setAsText(String text) throws IllegalArgumentException {SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd");Date date = null;try {date = format.parse(text);} catch (ParseException e) {format = new SimpleDateFormat("yyyy-MM-dd");try {date = format.parse(text);} catch (ParseException e1) {}}setValue(date);}} }然后,讓需要進(jìn)行格式轉(zhuǎn)換的類繼承這個(gè)工具類(如下圖)。即可。
public class RybRest extends BaseController{...}(2)獲取數(shù)據(jù)庫數(shù)據(jù),自定義其中的時(shí)間的格式。(使頁面顯示這個(gè)格式)
解決方法:
定義時(shí)間格式轉(zhuǎn)換工具類,
public class DateConvertUtil extends JsonSerializer<Date>{/*** @param value 表示要轉(zhuǎn)換的對(duì)象* @param gen 表示json串生成器* @param serializers json 串序列化提供者 (暫且不用關(guān)系)*/@Overridepublic void serialize(Date value,JsonGenerator gen,SerializerProvider serializers)throws IOException,JsonProcessingException {//1.創(chuàng)建日期轉(zhuǎn)換對(duì)象(如何保障如下對(duì)象每個(gè)線程有一份:了解ThreadLocal)SimpleDateFormat sdf=new SimpleDateFormat("yyyy/MM/dd");//2.將日期對(duì)象轉(zhuǎn)換為指定格式的字符串String dateStr=sdf.format(value);//3.將此字符串寫入到j(luò)son串中 gen.writeString(dateStr);} }在實(shí)體的get方法上面通過注解調(diào)用所定義的工具類。即可。
@JsonSerialize(using=DateConvertUtil.class) public Date getWrite_time() {return write_time;}重點(diǎn):
1)遇到bug的處理思想;
2)@InitBinder注解的使用;
附:(參考)
https://www.cnblogs.com/feng9exe/p/8036657.html
狀態(tài)碼
https://www.cnblogs.com/huhuixin/p/6823789.html
idea Debug快捷鍵
https://blog.csdn.net/zhangxiaoyang0/article/details/77896171
springMVC前臺(tái)傳遞日期類型到后臺(tái)
https://www.cnblogs.com/heyonggang/p/6186633.html
SpringMVC中利用@InitBinder來對(duì)頁面數(shù)據(jù)進(jìn)行解析綁定
?
轉(zhuǎn)載于:https://www.cnblogs.com/duandians/p/9851690.html
總結(jié)
以上是生活随笔為你收集整理的前后台传参类型、格式不同,解决思路的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SDN中的Heavy-Hitter测量文
- 下一篇: Luogu P3455 [POI2007