springboot 各種參數綁定 外加 自定義 參數解析,自定義序列化 反序列化, 看懂了這些 屌炸天,不在為參數解析 和返回數據而煩惱


小結 :各種參數解析,其實就是 springmvc 適配性 的作用 叫做參數解析器,根據類型 匹配對應的數據 

1.X 都是表單格式默認 為application/x-wwww-from-urlencoded 提交
2.X 都是 json 格式application/json 其實就是內部jackson 序列化對象

1.1 常規類型匹配 代碼如下 

      /**

 * 常規類型匹配
* @param name 字符串
* @param leader 0,false 都會解析成false 1 或者true 都會解析 true
* @param id
* @param age
* @param price
* @param em 枚舉類型 如傳 SUCCESS 串自己定義的枚舉大寫
* @return
*/
@PostMapping("dept/update")
public ResponseResult updateDept(String name, Boolean leader, Integer id
, Double age, BigDecimal price, ResponseResultCode em){

return ResponseResultFactory.success("添加成功");
}

1.2
集合類型
/**
* 集合類型 必須加 RequestParam 注解 不然報錯 No primary or default constructor found for interface
* @param ids 可以是 傳 1,2,3 逗號分隔 也可以 ids=1&ids=2 但是不能混合傳 解析器問題
* @return
*/
@PostMapping("dept/update/ids")
public ResponseResult updateDept(@RequestParam(value = "ids") List<Integer> ids){

return ResponseResultFactory.success("添加成功");
}
1.3 數組類型

/**
* 數組和和集合一樣
* @param ids
* @return
*/
@PostMapping("dept/update/ids1")
public ResponseResult updateDept(@RequestParam(value = "ids") Integer[] ids){

return ResponseResultFactory.success("添加成功");
}
1.4 map 類型


/**
* map 必須加上 @RequestParam 注解 不然 沒數據 看上去map 萬能接受 但是不推薦使用(除非不知道前端字段可以考慮)
* @param map
* @return
*/
@PostMapping("dept/update/map")
public ResponseResult updateDeptMap(@RequestParam Map map){

return ResponseResultFactory.success("添加成功");
}
1.5 對象類型
/**
* 普通對象類型
* @param user 如 id=12&name=小明 簡單傳就行
* @return
*/
@PostMapping("dept/addUser")
public ResponseResult addDept(User user){

return ResponseResultFactory.success("添加用戶");
}
1.6 復雜對象 對象里面套對象
/**
* 復雜對象 @RequestParam 不要用這個注解 不然匹配不上名字
* @param dept users[0].name=aaa&users[0].age=12&users[1].name=13&users[1].age=12&deptName=呵呵呵&ids=1,2,3
* @return
*/
@PostMapping("dept/Dept")
public ResponseResult addDept(Dept dept){

return ResponseResultFactory.success("添加用戶");
}
1.7 集合對象 第一種不適合 可以考慮 下面 string 轉換實現
@PostMapping("dept/users")
public ResponseResult addDept(@RequestParam(value = "users")List<User> users){

return ResponseResultFactory.success("添加用戶");
}

/**
* 集合對象
* @param users
* @return
*/
@PostMapping("dept/users1")
public ResponseResult addDept1(String users){
// 在轉換一次 json 工具
return ResponseResultFactory.success("添加用戶");
}

2.1 對象類型
/**
* 對象
* header格式 content-type:"application/json charset=utf-8", 參數 直接json 格式
* {"id": 1,name": "demoData","age": 1,"pthone": "demoData",email": "demoData"}
*
* $.ajax({
url: "srarch_data/search_data_detail.action",
type: "post",
dataType:'json',
contentType : 'application/json;charset=utf-8',
data: JSON.stringify(obj),
success: function (json) {

}
});
* @param user
* @return
*/
@PostMapping("addUser")
public ResponseResult addUser(@RequestBody User user){

return ResponseResultFactory.success("添加用戶");
}
2.2 集合 類型
/**
* 集合
* @param users [{"id": 1,"name": "demoData","age": 1,"pthone": "demoData","email": "demoData"},{"id": 1,"name": "demoData","age": 1,"pthone": "demoData","email": "demoData"}]
* @return
*/
@PostMapping("addUsers")
public ResponseResult addUsers(@RequestBody List<User> users){

return ResponseResultFactory.success("添加用戶");
}
2.3 復雜對象 傳遞

/**
*復雜對象 傳遞
* {
"id": 1,
"deptName": "demoData",
"users": [{
"id": 1,
"name": "demoData",
"age": 1,
"pthone": "demoData",
"email": "demoData"
}],
"createDate": "demoData",
"updateTime": "2019/6/3 12:12",
"ids": [
1
]
}
* @param dept
* @return
*/
@PostMapping("addDept")
public ResponseResult addDept2(@RequestBody Dept dept){

return ResponseResultFactory.success("添加用戶",dept);
}
2.4 map 類型
json 格式

 

 表單模式

 

 

 

/**
* 可以格式任意數據 @RequestParam 這個注解 可以不要 如果加了 @RequestBody, 但是表單格式必須加 @RequestParam
* @param dept
* @return
*/
@PostMapping("addDeptMap")
public ResponseResult addDept3(@RequestParam @RequestBody Map dept){

return ResponseResultFactory.success("添加用戶",dept);
}

2.5 混合模式 基本很少人折磨用 但是可以用

/**
* ================================== 表單模式和 json 格式混用 header 還是application/json url 上帶參數 =====================================
*/
/**
* 混合模式 基本很少人折磨用 但是可以用
* @param user
* @param id
*
* 例如 /mix?id=12 {"id": 1,"name": "demoData","age": 1,"pthone": "demoData","email": "demoData"}
* @return
*/
@PostMapping("mix")
public ResponseResult mix(@RequestBody User user,Integer id){

return ResponseResultFactory.success("添加用戶");
}
2.6 自定義 序列化 與反序列化
/**
* ========================================== 序列化 與反序列化 =====================================================
*/
/**
* 序列化與反序列 化
* @param user
* @return
*/
@PostMapping("edit/user")
public ResponseResult editUser(@RequestBody User user){

return ResponseResultFactory.success("添加用戶",user);
}
對象字段
@NotBlank(message = "郵箱不能我空",groups = {UserUpdate.class})
@JsonSerialize(using = ToUpperCaseSerializer.class)
@JsonDeserialize(using = ToLowerCaseCaseSerializer.class)
private String email;
2.7 日期格式 局部處理

/**
* 日期格式參數綁定
* @param date
* @return
*/
@PostMapping("edit/date")
public ResponseResult editDate(Date date){
return ResponseResultFactory.success("添加用戶",date);
}

/**
* 局部使用 類似 注解在對象上 @DateTimeFormat(pattern = "yyyy/MM/dd HH:ss") //入參 spring 注解 格式化時間 可參考全局配置
* @param binder
*/
@InitBinder
public void initBinder(WebDataBinder binder){
binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));
}

對象處理 可以使用注解

 

全局配置:

 



3.0 下面就是自定義參數解析器了,也就是 為什么參數 會根據類型 自動解析出綁定對應的數據 其實原理就是折磨簡單 具體實現 如下
/**
* 自定義 解析器
* @param user
* @return
*/
@PostMapping("edit/users2")
public ResponseResult editUser2(@CurrentUser String user){
return ResponseResultFactory.success("添加用戶",user);
}
@Component
public class CurrentUserArgumentResolver implements HandlerMethodArgumentResolver {
/**
* 適配有對應注解方法的參數 true 這回走下面的解析
* @param methodParameter
* @return
*/
@Override
public boolean supportsParameter(MethodParameter methodParameter) {
return methodParameter.hasParameterAnnotation(CurrentUser.class);
}

/**
* 線上可以 考慮 從session 或者 redis ,mysql 等 容器獲取當前用戶信息
* @param methodParameter
* @param modelAndViewContainer
* @param nativeWebRequest
* @param webDataBinderFactory
* @return
* @throws Exception
*/
@Override
public Object resolveArgument(MethodParameter methodParameter, @Nullable ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, @Nullable WebDataBinderFactory webDataBinderFactory) throws Exception {
return "helloWorld";
}

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM