前后台传参类型、格式不同,解决思路
思路:
找類型轉換類工具、格式轉換類工具。
(1)可能需要寫在控制層,那就需要使用@InitBinder注解,優先加載其中內容;(更好,更完善的方法:將這些方法寫在BaseController類中(可以自己建個工具類),需要進行這類轉換的控制器只需繼承BaseController即可)
(2)可能需要用在get方法上面,需要使用相應注解,使參數進get之前,先進工具類進行處理。再進入get。
例子:
(1)從前臺表單所獲取的數據的時間格式與后臺所能處理的時間格式不同,而springMVC不能自動轉換,需要手動定義轉換。
具體問題:在swagger頁面中修改、添加數據后,若時間填寫2118-8-8這種格式,則報400狀態碼(無法理解請求的參數)。若改成2018/8/8這種形式,則可以成功寫庫。
解決方法:
//將后臺所能處理的日期格式從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( "創建人員")@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)在控制層中方法之前添加粉色處代碼。即可。(會優先注冊這個編輯器)
2)效果:后臺能處理2118-8-8這種格式。但不能處理2018/8/8這種形式。
3)處理問題的思維歷程:通過debug找到問題的具體位置,鎖定具體原因。
如本例,在黃色熒光處打了斷點,發現在swagger添加、修改操作時,沒被斷點攔截就已經報錯。鎖定了數據沒傳過來的問題。同時,若不填寫時間數據,則添加、修改可以成功。鎖定問題是時間格式問題。
*優化:(目標:無論輸入2118-8-8這種格式,還是2018/8/8這種形式,均能成功寫庫)
創建工具類,如下
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);}} }然后,讓需要進行格式轉換的類繼承這個工具類(如下圖)。即可。
public class RybRest extends BaseController{...}(2)獲取數據庫數據,自定義其中的時間的格式。(使頁面顯示這個格式)
解決方法:
定義時間格式轉換工具類,
public class DateConvertUtil extends JsonSerializer<Date>{/*** @param value 表示要轉換的對象* @param gen 表示json串生成器* @param serializers json 串序列化提供者 (暫且不用關系)*/@Overridepublic void serialize(Date value,JsonGenerator gen,SerializerProvider serializers)throws IOException,JsonProcessingException {//1.創建日期轉換對象(如何保障如下對象每個線程有一份:了解ThreadLocal)SimpleDateFormat sdf=new SimpleDateFormat("yyyy/MM/dd");//2.將日期對象轉換為指定格式的字符串String dateStr=sdf.format(value);//3.將此字符串寫入到json串中 gen.writeString(dateStr);} }在實體的get方法上面通過注解調用所定義的工具類。即可。
@JsonSerialize(using=DateConvertUtil.class) public Date getWrite_time() {return write_time;}重點:
1)遇到bug的處理思想;
2)@InitBinder注解的使用;
附:(參考)
https://www.cnblogs.com/feng9exe/p/8036657.html
狀態碼
https://www.cnblogs.com/huhuixin/p/6823789.html
idea Debug快捷鍵
https://blog.csdn.net/zhangxiaoyang0/article/details/77896171
springMVC前臺傳遞日期類型到后臺
https://www.cnblogs.com/heyonggang/p/6186633.html
SpringMVC中利用@InitBinder來對頁面數據進行解析綁定
?
轉載于:https://www.cnblogs.com/duandians/p/9851690.html
總結
以上是生活随笔為你收集整理的前后台传参类型、格式不同,解决思路的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SDN中的Heavy-Hitter测量文
- 下一篇: Luogu P3455 [POI2007