欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

SpringBoot2.x中JSR-303實(shí)現(xiàn)請(qǐng)求參數(shù)校驗(yàn)的方法

這篇文章主要講解了“Spring Boot 2.x中JSR-303實(shí)現(xiàn)請(qǐng)求參數(shù)校驗(yàn)的方法”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“Spring Boot 2.x中JSR-303實(shí)現(xiàn)請(qǐng)求參數(shù)校驗(yàn)的方法”吧!

為涼山州等地區(qū)用戶(hù)提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及涼山州網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、涼山州網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專(zhuān)業(yè)、用心的態(tài)度為用戶(hù)提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶(hù)的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!

請(qǐng)求參數(shù)的校驗(yàn)是很多新手開(kāi)發(fā)非常容易犯錯(cuò),或存在較多改進(jìn)點(diǎn)的常見(jiàn)場(chǎng)景。比較常見(jiàn)的問(wèn)題主要表現(xiàn)在以下幾個(gè)方面:

  • 僅依靠前端框架解決參數(shù)校驗(yàn),缺失服務(wù)端的校驗(yàn)。這種情況常見(jiàn)于需要同時(shí)開(kāi)發(fā)前后端的時(shí)候,雖然程序的正常使用不會(huì)有問(wèn)題,但是開(kāi)發(fā)者忽略了非正常操作。比如繞過(guò)前端程序,直接模擬客戶(hù)端請(qǐng)求,這時(shí)候就會(huì)突然在前端預(yù)設(shè)的各種限制,直擊各種數(shù)據(jù)訪(fǎng)問(wèn)接口,使得我們的系統(tǒng)存在安全隱患。

  • 大量地使用if/else語(yǔ)句嵌套實(shí)現(xiàn),校驗(yàn)邏輯晦澀難通,不利于長(zhǎng)期維護(hù)。

所以,針對(duì)上面的問(wèn)題,建議服務(wù)端開(kāi)發(fā)在實(shí)現(xiàn)接口的時(shí)候,對(duì)于請(qǐng)求參數(shù)必須要有服務(wù)端校驗(yàn)以保障數(shù)據(jù)安全與穩(wěn)定的系統(tǒng)運(yùn)行。同時(shí),對(duì)于參數(shù)的校驗(yàn)實(shí)現(xiàn)需要足夠優(yōu)雅,要滿(mǎn)足邏輯易讀、易維護(hù)的基本特點(diǎn)。

接下來(lái),我們就在本篇教程中詳細(xì)說(shuō)說(shuō),如何優(yōu)雅地實(shí)現(xiàn)Spring Boot服務(wù)端的請(qǐng)求參數(shù)校驗(yàn)。

JSR-303

在開(kāi)始動(dòng)手實(shí)踐之前,我們先了解一下接下來(lái)我們將使用的一項(xiàng)標(biāo)準(zhǔn)規(guī)范:JSR-303

什么是JSR?

JSR是Java Specification Requests的縮寫(xiě),意思是Java 規(guī)范提案。是指向JCP(Java Community Process)提出新增一個(gè)標(biāo)準(zhǔn)化技術(shù)規(guī)范的正式請(qǐng)求。任何人都可以提交JSR,以向Java平臺(tái)增添新的API和服務(wù)。JSR已成為Java界的一個(gè)重要標(biāo)準(zhǔn)。

JSR-303定義的是什么標(biāo)準(zhǔn)?

JSR-303 是JAVA EE 6 中的一項(xiàng)子規(guī)范,叫做Bean Validation,Hibernate Validator 是 Bean Validation 的參考實(shí)現(xiàn) . Hibernate Validator 提供了 JSR 303 規(guī)范中所有內(nèi)置 constraint 的實(shí)現(xiàn),除此之外還有一些附加的 constraint。

Bean Validation中內(nèi)置的constraint

Spring Boot 2.x中JSR-303實(shí)現(xiàn)請(qǐng)求參數(shù)校驗(yàn)的方法

Hibernate Validator附加的constraint

Spring Boot 2.x中JSR-303實(shí)現(xiàn)請(qǐng)求參數(shù)校驗(yàn)的方法

在JSR-303的標(biāo)準(zhǔn)之下,我們可以通過(guò)上面這些注解,優(yōu)雅的定義各個(gè)請(qǐng)求參數(shù)的校驗(yàn)。更多關(guān)于JSR的內(nèi)容可以參與官方文檔或參考資料中的引文[1]。

動(dòng)手實(shí)踐

已經(jīng)了解了JSR-303之后,接下來(lái)我們就來(lái)嘗試一下,基于此規(guī)范如何實(shí)現(xiàn)參數(shù)的校驗(yàn)!

準(zhǔn)備工作

讀者可以拿任何一個(gè)使用Spring Boot 2.x構(gòu)建的提供RESTful API的項(xiàng)目作為基礎(chǔ)。也可以使用Spring Boot 2.x基礎(chǔ)教程:使用Swagger2構(gòu)建強(qiáng)大的API文檔中構(gòu)建的實(shí)驗(yàn)工程作為基礎(chǔ),您可以通過(guò)下面?zhèn)}庫(kù)中的chapter2-2目錄取得:

  • Github:https://github.com/dyc87112/SpringBoot-Learning/tree/2.x

  • Gitee:https://gitee.com/didispace/SpringBoot-Learning/tree/2.x

當(dāng)然,您也可以根據(jù)前文再構(gòu)建一個(gè)作為復(fù)習(xí),也是完全沒(méi)有問(wèn)題的。

快速入門(mén)

我們先來(lái)做一個(gè)簡(jiǎn)單的例子,比如:定義字段不能為Null。只需要兩步

第一步:在要校驗(yàn)的字段上添加上@NotNull注解,具體如下:

@Data
@ApiModel(description="用戶(hù)實(shí)體")
public class User {

    @ApiModelProperty("用戶(hù)編號(hào)")
    private Long id;

    @NotNull
    @ApiModelProperty("用戶(hù)姓名")
    private String name;

    @NotNull
    @ApiModelProperty("用戶(hù)年齡")
    private Integer age;

}

第二步:在需要校驗(yàn)的參數(shù)實(shí)體前添加@Valid注解,具體如下:

@PostMapping("/")
@ApiOperation(value = "創(chuàng)建用戶(hù)", notes = "根據(jù)User對(duì)象創(chuàng)建用戶(hù)")
public String postUser(@Valid @RequestBody User user) {
    users.put(user.getId(), user);
    return "success";
}

完成上面配置之后,啟動(dòng)應(yīng)用,并用POST請(qǐng)求訪(fǎng)問(wèn)localhost:8080/users/接口,body使用一個(gè)空對(duì)象,{}。你可以用Postman等測(cè)試工具發(fā)起,也可以使用curl發(fā)起,比如這樣:

curl -X POST \
  http://localhost:8080/users/ \
  -H 'Content-Type: application/json' \
  -H 'Postman-Token: 72745d04-caa5-44a1-be84-ba9c115f4dfb' \
  -H 'cache-control: no-cache' \
  -d '{
    
}'

不出意外,你可以得到如下結(jié)果:

{
    "timestamp": "2019-10-05T05:45:19.221+0000",
    "status": 400,
    "error": "Bad Request",
    "errors": [
        {
            "codes": [
                "NotNull.user.age",
                "NotNull.age",
                "NotNull.java.lang.Integer",
                "NotNull"
            ],
            "arguments": [
                {
                    "codes": [
                        "user.age",
                        "age"
                    ],
                    "arguments": null,
                    "defaultMessage": "age",
                    "code": "age"
                }
            ],
            "defaultMessage": "不能為null",
            "objectName": "user",
            "field": "age",
            "rejectedValue": null,
            "bindingFailure": false,
            "code": "NotNull"
        },
        {
            "codes": [
                "NotNull.user.name",
                "NotNull.name",
                "NotNull.java.lang.String",
                "NotNull"
            ],
            "arguments": [
                {
                    "codes": [
                        "user.name",
                        "name"
                    ],
                    "arguments": null,
                    "defaultMessage": "name",
                    "code": "name"
                }
            ],
            "defaultMessage": "不能為null",
            "objectName": "user",
            "field": "name",
            "rejectedValue": null,
            "bindingFailure": false,
            "code": "NotNull"
        }
    ],
    "message": "Validation failed for object='user'. Error count: 2",
    "path": "/users/"
}

其中返回內(nèi)容的各參數(shù)含義如下:

  • timestamp:請(qǐng)求時(shí)間

  • status:HTTP返回的狀態(tài)碼,這里返回400,即:請(qǐng)求無(wú)效、錯(cuò)誤的請(qǐng)求,通常參數(shù)校驗(yàn)不通過(guò)均為400

  • error:HTTP返回的錯(cuò)誤描述,這里對(duì)應(yīng)的就是400狀態(tài)的錯(cuò)誤描述:Bad Request

  • errors:具體錯(cuò)誤原因,是一個(gè)數(shù)組類(lèi)型;因?yàn)殄e(cuò)誤校驗(yàn)可能存在多個(gè)字段的錯(cuò)誤,比如這里因?yàn)槎x了兩個(gè)參數(shù)不能為Null,所以存在兩條錯(cuò)誤記錄信息

  • message:概要錯(cuò)誤消息,返回內(nèi)容中很容易可以知道,這里的錯(cuò)誤原因是對(duì)user對(duì)象的校驗(yàn)失敗,其中錯(cuò)誤數(shù)量為2,而具體的錯(cuò)誤信息就定義在上面的errors數(shù)組中

  • path:請(qǐng)求路徑

請(qǐng)求的調(diào)用端在拿到這個(gè)規(guī)范化的錯(cuò)誤信息之后,就可以方便的解析并作出對(duì)應(yīng)的措施以完成自己的業(yè)務(wù)邏輯了。

嘗試一些其他校驗(yàn)

在完成了上面的例子之后,我們還可以增加一些校驗(yàn)規(guī)則,比如:校驗(yàn)字符串的長(zhǎng)度、校驗(yàn)數(shù)字的大小、校驗(yàn)字符串格式是否為郵箱等。下面我們就來(lái)定義一些復(fù)雜的校驗(yàn)定義,比如:

@Data
@ApiModel(description="用戶(hù)實(shí)體")
public class User {

    @ApiModelProperty("用戶(hù)編號(hào)")
    private Long id;

    @NotNull
    @Size(min = 2, max = 5)
    @ApiModelProperty("用戶(hù)姓名")
    private String name;

    @NotNull
    @Max(100)
    @Min(10)
    @ApiModelProperty("用戶(hù)年齡")
    private Integer age;

    @NotNull
    @Email
    @ApiModelProperty("用戶(hù)郵箱")
    private String email;

}

發(fā)起一個(gè)可以出發(fā)name、age、email都校驗(yàn)不通過(guò)的請(qǐng)求,比如下面這樣:

curl -X POST \
  http://localhost:8080/users/ \
  -H 'Content-Type: application/json' \
  -H 'Postman-Token: 114db0f0-bdce-4ba5-baf6-01e5104a68a3' \
  -H 'cache-control: no-cache' \
  -d '{
    "name": "abcdefg",
    "age": 8,
    "email": "aaaa"
}'

我們將得到如下的錯(cuò)誤返回:

{
    "timestamp": "2019-10-05T06:24:30.518+0000",
    "status": 400,
    "error": "Bad Request",
    "errors": [
        {
            "codes": [
                "Size.user.name",
                "Size.name",
                "Size.java.lang.String",
                "Size"
            ],
            "arguments": [
                {
                    "codes": [
                        "user.name",
                        "name"
                    ],
                    "arguments": null,
                    "defaultMessage": "name",
                    "code": "name"
                },
                5,
                2
            ],
            "defaultMessage": "個(gè)數(shù)必須在2和5之間",
            "objectName": "user",
            "field": "name",
            "rejectedValue": "abcdefg",
            "bindingFailure": false,
            "code": "Size"
        },
        {
            "codes": [
                "Min.user.age",
                "Min.age",
                "Min.java.lang.Integer",
                "Min"
            ],
            "arguments": [
                {
                    "codes": [
                        "user.age",
                        "age"
                    ],
                    "arguments": null,
                    "defaultMessage": "age",
                    "code": "age"
                },
                10
            ],
            "defaultMessage": "最小不能小于10",
            "objectName": "user",
            "field": "age",
            "rejectedValue": 8,
            "bindingFailure": false,
            "code": "Min"
        },
        {
            "codes": [
                "Email.user.email",
                "Email.email",
                "Email.java.lang.String",
                "Email"
            ],
            "arguments": [
                {
                    "codes": [
                        "user.email",
                        "email"
                    ],
                    "arguments": null,
                    "defaultMessage": "email",
                    "code": "email"
                },
                [],
                {
                    "defaultMessage": ".*",
                    "codes": [
                        ".*"
                    ],
                    "arguments": null
                }
            ],
            "defaultMessage": "不是一個(gè)合法的電子郵件地址",
            "objectName": "user",
            "field": "email",
            "rejectedValue": "aaaa",
            "bindingFailure": false,
            "code": "Email"
        }
    ],
    "message": "Validation failed for object='user'. Error count: 3",
    "path": "/users/"
}

errors數(shù)組中的各個(gè)錯(cuò)誤明細(xì)中,知道各個(gè)字段的defaultMessage,可以看到很清晰的錯(cuò)誤描述。

Swagger文檔中的體現(xiàn)

可能有讀者會(huì)問(wèn)了,我的接口中是定了這么多。上一篇教程中,不是還教了如何自動(dòng)生成文檔么,那么對(duì)于參數(shù)的校驗(yàn)邏輯該如何描述呢?

這里要分兩種情況,Swagger自身對(duì)JSR-303有一定的支持,但是支持的并那么完善,并沒(méi)有覆蓋所有的注解的。

比如,上面我們使用的注解是可以自動(dòng)生成的,啟動(dòng)上面我們的實(shí)驗(yàn)工程,然后訪(fǎng)問(wèn)http://localhost:8080/swagger-ui.html,在Models不是,我們可以看到如下圖所示的內(nèi)容:

Spring Boot 2.x中JSR-303實(shí)現(xiàn)請(qǐng)求參數(shù)校驗(yàn)的方法

其中:nameage字段相比上一篇教程中的文檔描述,多了一些關(guān)于校驗(yàn)相關(guān)的說(shuō)明;而email字段則沒(méi)有體現(xiàn)相關(guān)校驗(yàn)說(shuō)明。目前,Swagger共支持以下幾個(gè)注解:@NotNull、@Max、@Min@Size、@Pattern。在實(shí)際開(kāi)發(fā)過(guò)程中,我們需要分情況來(lái)處理,對(duì)于Swagger支自動(dòng)生成的可以利用原生支持來(lái)產(chǎn)生,如果有部分字段無(wú)法產(chǎn)生,則可以在@ApiModelProperty注解的描述中他,添加相應(yīng)的校驗(yàn)說(shuō)明,以便于使用方查看。

番外:也許你會(huì)有這些疑問(wèn)

當(dāng)請(qǐng)求參數(shù)校驗(yàn)出現(xiàn)錯(cuò)誤信息的時(shí)候,錯(cuò)誤格式可以修改嗎?

答案是肯定的。這里的錯(cuò)誤信息實(shí)際上由Spring Boot的異常處理機(jī)制統(tǒng)一組織并返回的,我們將在后面的教程中詳細(xì)介紹,Spring Boot是如何統(tǒng)一處理異常返回以及我們?cè)撊绾味〞r(shí)異常返回。

spring-boot-starter-validation是必須的嗎?

有讀者之前問(wèn)過(guò),看到很多教程都寫(xiě)了還要引入spring-boot-starter-validation依賴(lài),這個(gè)依賴(lài)到底是否需要?(本篇中并沒(méi)有引入)

<dependency>
    <groupid>org.springframework.boot</groupid>
    <artifactid>spring-boot-starter-validation</artifactid>
</dependency>

其實(shí),只需要仔細(xì)看一下spring-boot-starter-validation依賴(lài)主要是為了引入了什么,再根據(jù)當(dāng)前自己使用的Spring Boot版本來(lái)判斷即可。實(shí)際上,spring-boot-starter-validation依賴(lài)主要是為了引入下面這個(gè)依賴(lài):

<dependency>
   <groupid>org.hibernate.validator</groupid>
    <artifactid>hibernate-validator</artifactid>
    <version>6.0.14.Final</version>
    <scope>compile</scope>
</dependency>

我們可以看看當(dāng)前工程的依賴(lài)中是否有它,就可以判斷是否還需要額外引入。在Spring Boot 2.1版本中,該依然其實(shí)已經(jīng)包含在了spring-boot-starter-web依賴(lài)中,并不需要額外引入,所以您在本文中找不到這一步。

代碼示例

本文的完整工程可以查看下面?zhèn)}庫(kù)中的chapter2-3目錄:

  • Github:https://github.com/dyc87112/SpringBoot-Learning/tree/2.x

  • Gitee:https://gitee.com/didispace/SpringBoot-Learning/tree/2.x

感謝各位的閱讀,以上就是“Spring Boot 2.x中JSR-303實(shí)現(xiàn)請(qǐng)求參數(shù)校驗(yàn)的方法”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)Spring Boot 2.x中JSR-303實(shí)現(xiàn)請(qǐng)求參數(shù)校驗(yàn)的方法這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

分享文章:SpringBoot2.x中JSR-303實(shí)現(xiàn)請(qǐng)求參數(shù)校驗(yàn)的方法
文章出自:http://aaarwkj.com/article24/ihhgce.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化、標(biāo)簽優(yōu)化、品牌網(wǎng)站建設(shè)外貿(mào)建站、軟件開(kāi)發(fā)、網(wǎng)站改版

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)
天天免费日日夜夜夜夜| 91亚色在线免费观看| 欧美精品在线高清观看| 久久精品亚洲毛片美女极品| 日本精品在线不卡视频| 国产精品伦一区二区三级| 人妻天天爽夜夜爽欧美色| 91精品在线观看首页| 青青草最新网址在线观看视频| 高h视频在线播放观看| 白白在线观看网站看看亚洲| 成人av资源在线观看| 青青草免费在线视频蜜臀| 国产三级成人在线视频| 丰满高潮少妇在线观看| 中文字幕一区日韩欧美| 日韩一区精品视频一区二区| 开心五月婷婷丁香综合| 色婷婷区二区三区四区| 可以免费看的日韩黄色| 欧美精品一区二区网址| 久久精品中文字幕有码日本道| 亚洲国产精品成人女人| 日韩欧美二区三区在线| 日本韩国一级黄色免费| 五月婷婷丁香婷婷丁香| 一区二区欧美日韩91| 国产激情久久久久久久久久久| 精品欧美高清免费视频| 亚洲中文字幕高清无二区| 日韩女同一区二区三区在线观看| 午夜福利一区二区在线| 亚洲国产日韩欧美在线播放| 成人黄色av大片在线观看| 日韩精品精美视频在线观看 | 十八禁在线观看网址免费| 操小姑娘国产精品视频| 最新日韩av一区二区| 国内揄拍国内精品对久久| 亚洲免费三级黄色片| 国产黄片免费看久久久|