Spring中使用JSR303請(qǐng)求約束判空的實(shí)現(xiàn)
有時(shí)候我們?cè)诒韱卫锾峤灰幌盗袇?shù), 到后臺(tái)封裝成一個(gè)對(duì)象, 要對(duì)對(duì)象的屬性做各種字段值的約束; 這時(shí)候, 當(dāng)然可以if-else一個(gè)一個(gè)的判斷, 有更簡(jiǎn)潔的做法, 就是使用 JSR303+spring的validation:
2. 使用方法步驟(分3步) 實(shí)體類加字段約束注解 Controller類中@Valid標(biāo)注啟用(@Validated也兼容@Valid) BindingResult獲取報(bào)錯(cuò)信息2.1 實(shí)體類加字段約束注解
如我們要收集前端表單的字段數(shù)據(jù)到Person實(shí)體中:
對(duì)需要約束的字段進(jìn)行注解標(biāo)注;
示例:
2.1.1 Person.java
package com.niewj.demo.model;import lombok.Data;import org.hibernate.validator.constraints.Length;import org.hibernate.validator.constraints.URL;import javax.validation.constraints.*;import java.util.List;@Datapublic class Person { @Length(min = 4, max = 10) @NotNull(message = 'name不能為空') private String name; @Min(0) @Max(40) @NotNull(message = 'age不能為空') private Integer age; @NotBlank @NotBlank @URL(message = 'logo必須是URL格式') private String logo; @NotEmpty(message = 'hobbies不能為空') private List<String> hobbies; @Email @NotNull(message = 'email不能為空!') private String mail;}
@NotNull 約束字段不可為空;
@NotEmpty 約束集合/map等不能為空不能為0元素
@Email 約束是 email格式
@URL 約束必須是url的格式
message屬性可以修改默認(rèn)錯(cuò)誤說(shuō)明
2.2 Controller類中@Valid標(biāo)注啟用(@Validated兼容@Valid)
2.2.1 HelloController.java
package com.niewj.demo.controller;import com.google.gson.Gson;import com.niewj.demo.common.Result;import com.niewj.demo.model.Person;import com.niewj.demo.service.TestService1;import org.springframework.stereotype.Controller;import org.springframework.validation.BindingResult;import org.springframework.web.bind.annotation.*;import javax.annotation.Resource;import javax.validation.Valid;import java.util.HashMap;import java.util.Map;/** * test * * @author niewj * @since 2020/11/16 15:22 */@Controllerpublic class HelloController { /** * @param person * @param bindingResult * @return */ @PostMapping('/test') @ResponseBody public Result doSth(@Valid @RequestBody Person person, BindingResult bindingResult) { Map<String, String> map = new HashMap<>(); if (bindingResult.hasErrors()) { bindingResult.getFieldErrors().stream().forEach(fe-> map.put(fe.getField(), fe.getDefaultMessage())); System.out.println(bindingResult.getFieldError().getDefaultMessage()); return Result.withErrorParamData(map); } return Result.withSuccessData(person); }}
@RequestBody可以將body中的請(qǐng)求流信息(Request.getInputStream)通過(guò)HttpMessageConverter自動(dòng)轉(zhuǎn)換為目標(biāo)java類型:
如果前端 Content-Type為application/json, 就使用 JSON消息轉(zhuǎn)換器 幫你轉(zhuǎn)為JSON對(duì)象; 如果前端 Content-Type為application/xml, 就使用 XML消息轉(zhuǎn)換器 幫你轉(zhuǎn)為xml; 如果前端 Content-Type為text/plain, 就是用 String消息轉(zhuǎn)換器 幫你轉(zhuǎn)成 String; (只有類型為String時(shí)才可以轉(zhuǎn)換)2.2.2 Result.java:
package com.niewj.demo.common;import lombok.Data;import java.io.Serializable;import java.util.Map;/** * 返回結(jié)果模板封裝 * * @author niewj * @since 2020/12/17 18:05 */@Datapublic class Result<T> implements Serializable { private int code; private String msg; private T data; public Result(int code, String msg, T data) { this(code, msg); this.data = data; } public Result(int code, String msg) { this.msg = msg; this.code = code; } public static <T> Result<T> withData(ResponseEnum responseCode, T data) { Result<T> re = new Result(responseCode.getCode(), responseCode.getMsg()); re.data = data; return re; } public static Result<String> withSuccessNoData() { Result re = new Result(ResponseEnum.SUCCESS.getCode(), ResponseEnum.SUCCESS.getMsg()); re.data = ''; return re; } public static <T> Result<T> withSuccessData(T data) { Result re = new Result(ResponseEnum.SUCCESS.getCode(), ResponseEnum.SUCCESS.getMsg()); re.data = data; return re; } public static Result<Map<String, String>> withErrorParamData(Map<String, String> data) { Result re = new Result(ResponseEnum.BAD_REQUEST.getCode(), ResponseEnum.BAD_REQUEST.getMsg()); re.data = data; return re; }}
2.2.3 ResponseEnum.java
package com.niewj.demo.common;/** * 通用響應(yīng)碼 */public enum ResponseEnum { SUCCESS(200, '成功'), BAD_REQUEST(400, '請(qǐng)求參數(shù)不合規(guī)'); /** * 錯(cuò)誤碼 */ private Integer code; /** * 錯(cuò)誤信息 */ private String msg; ResponseEnum(Integer code, String msg) { this.code = code; this.msg = msg; } public String getMsg() { return msg; } public Integer getCode() { return code; }}
2.3 BindingResult獲取報(bào)錯(cuò)信息
BindingResult用來(lái)收集約束字段的錯(cuò)誤信息, 可通過(guò) bindingResult.hasErrors()的 true來(lái)過(guò)濾錯(cuò)誤信息; bindingResult.getFieldErrors() 會(huì)返回 List<FieldError>; FieldError 得到字段名: getField(); 得到錯(cuò)誤信息: getDefaultMessage() 3. 調(diào)用測(cè)試:http://localhost:8888/test
3.1 請(qǐng)求用例1: 字段為空
header: Content-Type: application/json
{ 'name': '1'}
響應(yīng):
{ 'code': 400, 'msg': '請(qǐng)求參數(shù)不合規(guī)', 'data': { 'mail': 'email不能為空!', 'hobbies': 'hobbies不能為空', 'name': '長(zhǎng)度需要在4和10之間', 'logo': '不能為空', 'age': 'age不能為空' }}
3.2 請(qǐng)求用例2: list無(wú)元素/email/url格式不對(duì)
header: Content-Type: application/json
{ 'name': '1234', 'hobbies': [], 'mail': 'niewj', 'logo': 'niewj.com'}
響應(yīng):
{ 'code': 400, 'msg': '請(qǐng)求參數(shù)不合規(guī)', 'data': { 'mail': '不是一個(gè)合法的電子郵件地址', 'hobbies': 'hobbies不能為空', 'logo': 'logo必須是URL格式', 'age': 'age不能為空' }}
3.3 請(qǐng)求用例3: 完整字段信息
header: Content-Type: application/json
{ 'name': '1234', 'hobbies': ['running'], 'mail': 'hi@niewj.com', 'logo': 'http://niewj.com', 'age': 40}
響應(yīng):
{ 'code': 200, 'msg': '成功', 'data': { 'name': '1234', 'age': 40, 'logo': 'http://niewj.com', 'hobbies': [ 'running' ], 'mail': 'hi@niewj.com' }}
到此這篇關(guān)于Spring中使用JSR303請(qǐng)求約束判空的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Spring JSR303請(qǐng)求約束判空內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!
相關(guān)文章:
1. html中的form不提交(排除)某些input 原創(chuàng)2. ASP常用日期格式化函數(shù) FormatDate()3. 開發(fā)效率翻倍的Web API使用技巧4. XMLHTTP資料5. CSS3實(shí)現(xiàn)動(dòng)態(tài)翻牌效果 仿百度貼吧3D翻牌一次動(dòng)畫特效6. asp.net core項(xiàng)目授權(quán)流程詳解7. vue使用moment如何將時(shí)間戳轉(zhuǎn)為標(biāo)準(zhǔn)日期時(shí)間格式8. CSS3中Transition屬性詳解以及示例分享9. jsp文件下載功能實(shí)現(xiàn)代碼10. ASP動(dòng)態(tài)網(wǎng)頁(yè)制作技術(shù)經(jīng)驗(yàn)分享
