日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

利用JSON-schema校验请求报文,封装转换错误信息,提示前台

發(fā)布時間:2025/6/15 javascript 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 利用JSON-schema校验请求报文,封装转换错误信息,提示前台 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

JSON-chema的語法就不講述了,可自行查閱相關(guān)文檔。

需求場景:前臺請求接口的報文,為防止被非法攔截,需要后臺再校驗一遍報文合法性,之前都是在java代碼中,用java代碼來判斷,查閱資料找到了json-schema-validate,一些基本簡單的校驗可以交給它來完成。

但是校驗的具體哪個字段的提示信息不能以中文提示返回給前臺,所以自己寫了一個解析 校驗結(jié)果的方法,來將檢驗結(jié)果錯誤信息以中文形式提示給前臺。不多說,上代碼



/**** 讀取定義的schema文件 */ @Slf4j public class ReadJsonFromFileUtil {/**** 將文件中的json串解析成jsonNode* 現(xiàn)在未將結(jié)果緩存,會有效率問題* @param fileName 文件名稱* @return*/public static JsonNode readJSONfile(String fileName) {//無法使用Cacheable 注解,JsonNode 未實現(xiàn)序列號接口。暫時用此方法Object cacheValue = SingletonUtil.getInstance().get(BusinessConstant.SINGLETON_KEY_JSONNODE + fileName);if (cacheValue != null) {return (JsonNode) cacheValue;}JsonNode instance = null;try {// in = ReadJsonFromFileUtil.class.getClassLoader().getResourceAsStream("json/" + fileName + ".json");// instance = new JsonNodeReader().fromInputStream(in);//instance = JsonLoader.fromResource("/json/" + fileName + ".json");SingletonUtil.getInstance().set(BusinessConstant.SINGLETON_KEY_JSONNODE + fileName, instance);} catch (Exception e) {log.error("[ReadJsonFromFileUtil] readJSONfile Exception!!! \n ", e);}return instance;}}

我的jsonschema配置文件 放在了/src/main/resources/json目錄下



@Slf4j public class BaseJsonValidateUtil {private final static JsonSchemaFactory factory = JsonSchemaFactory.byDefault();/**** 根據(jù)定義的json schema 校驗json格式* @param jsonFileName schema 文件名稱* @param params 傳遞的json 串*/public static ProcessingReport ValidateJsonFormat(String jsonFileName, JSONObject params) {log.info("recevie validate schema is {}, \n request params is \n {} ", jsonFileName, params);JsonNode schema = ReadJsonFromFileUtil.readJSONfile(jsonFileName);JsonNode data = convertJsonToNode(params);Preconditions.checkNotNull(schema, "未定義數(shù)據(jù)模板");Preconditions.checkNotNull(data, "缺少配置信息");ProcessingReport report = factory.getValidator().validateUnchecked(schema, data);//如果定義了empty_message 或者error_message 的話,將這些信息以異常的方式拋給前端convertMessage(report, schema);if (log.isDebugEnabled()) {log.debug("JsonSchema validate result {} \n", report);}Preconditions.checkArgument(report.isSuccess(), "請求數(shù)據(jù)格式非法");return report;}/**** 將json轉(zhuǎn)換未 JsonNode* @param paramsJson* @return*/private static JsonNode convertJsonToNode(JSONObject paramsJson) {JsonNode actualObj = null;try {ObjectMapper mapper = new ObjectMapper();actualObj = mapper.readTree(paramsJson.toJSONString());} catch (IOException e) {log.error("convertJsonToNode Exception!!! \n {}", e);return actualObj;}return actualObj;}/****根據(jù) report里面的錯誤字段,找到schema對應(yīng)字段定義的中文提示,顯示都前端* @param report 校驗json 的結(jié)果,里面包含錯誤字段,錯誤信息。* @param schema 原始的schema文件。主要用來讀取empty_message,error_message中文信息*/private static void convertMessage(ProcessingReport report, JsonNode schema) {Iterator<ProcessingMessage> iter = report.iterator();ProcessingMessage processingMessage = null;//保存校驗失敗字段的信息JsonNode schemaErrorFieldJson = null;//原始校驗返回的信息JsonNode validateResult = null;while (iter.hasNext()) {processingMessage = iter.next();validateResult = processingMessage.asJson();//keyword表示 一定是不符合schema規(guī)范JsonNode keywordNode = validateResult.get("keyword");if (null != keywordNode) {//說明json validate 失敗 String keyword = keywordNode.textValue();schemaErrorFieldJson = findErrorField(schema, validateResult);//keyword 如果是require說明缺少必填字段,取schema中 字段對應(yīng)的empty_messageif ("required".equalsIgnoreCase(keyword)) {//如果是require,找到哪個字段缺少了JsonNode missingNode = null;if (null == schemaErrorFieldJson) {missingNode = validateResult.get("missing");schemaErrorFieldJson = schema.get("properties").get(missingNode.get(0).textValue());}if (null != schemaErrorFieldJson.get("empty_message")) {log.error("validate field 【requeied】[{}] fail.", JSON.toJSON(schemaErrorFieldJson));Preconditions.checkArgument(false, schemaErrorFieldJson.get("empty_message").textValue());}} else {//非必填校驗失敗。說明是格式驗證失敗。取schema中 字段對應(yīng)的error_messageif (null != schemaErrorFieldJson.get("error_message")) {log.error("validate field 【validate】 [{}] fail.", JSON.toJSON(schemaErrorFieldJson));Preconditions.checkArgument(false, schemaErrorFieldJson.get("error_message").textValue());}}}}}/**** 根據(jù)校驗結(jié)果的 schema pointer 中的url遞歸尋找JsonNode* @param schema* @param validateResult* @return*/private static JsonNode findErrorField(JsonNode schema, JsonNode validateResult) {//取到的數(shù)據(jù)是String[] split = validateResult.get("schema").get("pointer").textValue().split("/");JsonNode tempNode = null;if (!ArrayUtils.isEmpty(split)) {for (int i = 1; i < split.length; i++) {if (i == 1) {tempNode = read(schema, validateResult, split[i]);} else {tempNode = read(tempNode, validateResult, split[i]);}}}return tempNode;}private static JsonNode read(JsonNode jsonNode, JsonNode validateResult, String fieldName) {return jsonNode.get(fieldName);} }


所以功能都在ValidateJsonFormat 方法中完成

第一步:讀取指定的schema文件

JsonNode schema = ReadJsonFromFileUtil.readJSONfile(jsonFileName);


第二步:將請求的json轉(zhuǎn)換成JsonNode

JsonNode data = convertJsonToNode(params);


第三步:調(diào)用json-schema校驗方法,校驗是否合法

ProcessingReport report = factory.getValidator().validateUnchecked(schema, data);


第四步:將校驗返回的結(jié)果解析,并將定義的empty_message,或者error_message 提示給前臺

PS:這兩個字段是自定義字段。非json-schema標(biāo)準(zhǔn)語法字段。所以檢驗結(jié)果中,會提示語法錯誤,但不影響我們使用

empty_message: 表示沒有此字段,觸發(fā)了required校驗,會取此字段信息提示到前臺

error_message: 表示不符合定義的校驗規(guī)則(enum,maxlength,minlength,pattern等等),會取此字段中的中文提示

如果這兩個字段為定義,則會觸發(fā)

Preconditions.checkArgument(report.isSuccess(), "請求數(shù)據(jù)格式非法");


schema樣例


{"type": "object","description": "測試接口","properties": {"productCode": { "type": "string", "minLength": 1 },"birthday": { "type": "string", "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$" ,"empty_message":"請選擇出生日期","error_message":"出生日期格式不正確"},"gender": { "type": "string", "enum": ["M", "F"],"empty_message":"請選擇性別","error_message":"性別輸入非法" },"period": { "type": "string", "enum": ["20", "30","999"],"empty_message":"請選擇期間","error_message":"期間輸入非法" },"buyCount": { "type": "number", "multipleOf": 1,"minimum": 5,"maximum":10,"exclusiveMinimum":false,"exclusiveMaximum": false ,"empty_message":"請選擇購買份數(shù)","error_message":"購買份數(shù)輸入非法"},"amount": { "type": "string","empty_message":"請輸入金額"}},"required": ["productCode","birthday","gender","period","buyCount","amount"] }

請求json樣例 {"productCode":"TEST", "birthday":"2010-02-09", "gender": "M", "period": "20", "buyCount":5, "amount":"50000"}

controller


@RequestMapping(value = "/check", method = RequestMethod.POST)@ResponseBodypublic JSONObject check(@RequestBody JSONObject params) {JSONObject result = BusinessCommonResponseUtil.createSuc(null);try {ProcessingReport schemaValidateReport = BaseJsonValidateUtil.ValidateJsonFormat("schema_rial", params);log.info("response ={}", result);return result;} catch (IllegalArgumentException argException) {log.error("check IllegalArgumentException!!! \n ", argException);return BusinessCommonResponseUtil.createFail(argException.getMessage());} catch (Exception e) {log.error(check Exception!!! \n ", e);return BusinessCommonResponseUtil.createFail("系統(tǒng)異常");}}controller返回的json報文格式根據(jù)業(yè)務(wù)而定



convertMessage方法說明: 此方法無法將 type: array類型的元素的錯誤信息以中文提示給前臺。


@Slf4j 注解屬于是lombok注解,編譯器需要安裝此插件。其余錯誤引入相關(guān)依賴即可

如果有什么好的想法,歡迎交流。






總結(jié)

以上是生活随笔為你收集整理的利用JSON-schema校验请求报文,封装转换错误信息,提示前台的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美交受高潮1 | 色欲av伊人久久大香线蕉影院 | 日韩精品一区二区电影 | 欧美一区二区在线视频 | 日韩一区在线观看视频 | 美女扒开内裤让男人桶 | 谁有av网址 | 亚洲国产成人精品女人 | 国产成人无码精品久久 | 亚洲综合中文字幕在线 | 国产精品伦一区二区 | 精品少妇人妻AV无码专区在线 | 国产在线观看不卡 | 亚洲自拍p| 日韩一区二区三区网站 | 欧美大肥婆大肥bbbbb | 久久久久网 | 午夜剧场在线 | 色网导航站 | 精品国产999 | 亚洲av片在线观看 | 黄色在线免费 | 国产全肉乱妇杂乱视频 | 三上悠亚三级 | 未满十八18禁止免费无码网站 | 爽爽爽av | 久久理论电影 | 欧美伊人影院 | 久久精工是国产品牌吗 | 免费av在线网 | 在线播放一区二区三区 | 看了下面会湿的视频 | 日本人与黑人做爰视频 | 欧美另类极品videosbest使用方法 | 在线免费播放av | 国产女人视频 | 欧美午夜不卡 | 成年人福利 | 一本在线免费视频 | 日本伦理一区二区 | 天天色综合图片 | 欧美二级片 | 国产无遮挡又黄又爽在线观看 | 三级免费网址 | av大片在线| 亚洲国产精品视频一区 | 国产三级短视频 | 国产视频一区二区三区在线 | 菲律宾黄色片 | 成人精品视频99在线观看免费 | 99热com| 国产第一页在线 | 国内性爱视频 | 中文字幕无线精品亚洲乱码一区 | 亚洲av无码国产精品久久不卡 | 最近最经典中文mv字幕 | 麻豆www.| 男女毛片视频 | 日韩美女网站 | 亚洲色图综合 | 国产精品你懂的 | 狠狠操亚洲 | 5个黑人躁我一个视频 | 免费在线看污片 | 色草在线| 久久久久久久久久一区二区 | 精品国产乱码久久久久久88av | 亚洲AV无码国产精品 | 亚洲一区二区视频在线播放 | 色撸撸在线 | 国产欧美精品一区二区三区 | 人人干天天干 | av在线资源播放 | 久久性色 | 久久无码人妻一区二区三区 | 日本小视频网站 | 久久在线免费观看视频 | 欧美日韩亚洲精品一区二区 | 波多野结衣一区二区三区免费视频 | 久久一级视频 | 激情综| 伊人久久综合视频 | 香蕉国产精品 | 男女做网站 | 麻豆激情视频 | 一级女人毛片 | 成人高潮片免费视频 | 黄色在线视频观看 | 亚洲精品2区 | 91在线公开视频 | 18xxxx日本| 91av一区二区三区 | 国产视频一区二区三区四区五区 | 污视频网站免费观看 | 欧美极品一区 | 波多野结衣 久久 | 小向美奈子在线观看 | 久久国产精品免费观看 | 意大利少妇愉情理伦片 |