最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot接口接收json參數(shù)解析

 更新時(shí)間:2021年10月19日 11:23:15   作者:葫蘆胡  
這篇文章主要介紹了SpringBoot接口接收json參數(shù)解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

SpringBoot接口接收json參數(shù)

前言

通常來(lái)講,HTTP 方法會(huì)映射為 CRUD 動(dòng)作,但這并不是嚴(yán)格的限制,有時(shí)候 PUT 也可以用來(lái)創(chuàng)建新的資源,POST 也可以用來(lái)更新資源。所以在平時(shí)的 Web 開(kāi)發(fā)中,你可能??吹絤ethod 的值是 GET 和 POST,但是我們需要養(yǎng)成一個(gè)好的編碼習(xí)慣。

CRUD 動(dòng)作 HTTP 方法
Create POST
Read GET
Update PUT(全部資源) 或 PATCH(部分資源)
Delete DELETE

前提

首先在controller上加上注解:@RestController

@RestController
@RequestMapping("/user")
@Api(tags = "user", description = "用戶控制器")
public class UserController {
    // ...
}

詳細(xì)介紹

一、GET

1)@PathVariable 獲取路徑參數(shù)。即 url/{id} 這種形式。

    @GetMapping("/getDetail/{id}")
    @ApiOperation(value = "根據(jù)id獲取用戶")
    public RbacUser getDetail(@PathVariable Long id) {
        return userService.getById(id);
    }

2)@RequestParam 獲取查詢參數(shù)。即 url?name=xx 這種形式

主要有參數(shù):

  • value:參數(shù)名字,即入?yún)⒌恼?qǐng)求參數(shù)名字,如username表示請(qǐng)求的參數(shù)區(qū)中的名字為username的參數(shù)的值將傳入;
  • required:是否必須,默認(rèn)是true,表示請(qǐng)求中一定要有相應(yīng)的參數(shù),否則會(huì)報(bào)錯(cuò);
    @GetMapping("/getByAccount")
    @ApiOperation(value = "根據(jù)賬號(hào)獲取用戶")
    public RbacUser getByAccount(@RequestParam(required = false) String account) {
        return userService.getByAccount(account);
    }

3) 直接封裝DTO參數(shù)形式

    @GetMapping("/find")
    @ApiOperation(value = "根據(jù)條件獲取用戶")
    public List<RbacUser> find(RbacUserDTO rbacUserDTO) {
        return userService.find(rbacUserDTO);
    }

二、DELETE

@PathVariable 獲取路徑參數(shù)。即 url/{id} 這種形式。

    @DeleteMapping("/delete/{id}")
    @ApiOperation(value = "刪除用戶")
    public void delete(@PathVariable Long id) {
        userService.delete(id);
    }

三、POST/PUT/PATCH

@RequestBody 將HTTP請(qǐng)求正文插入方法中,使用適合的 HttpMessageConverter 將請(qǐng)求體寫(xiě)入某個(gè)對(duì)象。

    @PostMapping("/create")
    @ApiOperation(value = "創(chuàng)建用戶")
    public RbacUser getByAccount(@RequestBody @Validated RbacUserDTO rbacUserDTO) {
        return userService.save(rbacUserDTO);
    }
  • @Validated:對(duì)數(shù)據(jù)進(jìn)行校驗(yàn),以下注解報(bào)錯(cuò)會(huì)直接返回,如果校驗(yàn)類中包含一個(gè)對(duì)象引用屬性,需要在屬性上加上@Valid注解

具體參數(shù)檢驗(yàn)請(qǐng)參看下面

Springboot restFul 參數(shù)檢驗(yàn)

概述

對(duì)請(qǐng)求參數(shù)進(jìn)行檢驗(yàn),這在web中開(kāi)始經(jīng)常能碰到,如果用一個(gè)個(gè)if/else去做判斷,相信這樣的代碼可讀性會(huì)比較差

JSR-303 是java為bean數(shù)據(jù)合法性校驗(yàn)提供的標(biāo)準(zhǔn)框架,是Java EE6中的一項(xiàng)子規(guī)范,叫做BeanValidation。JSR303通過(guò)在Bean屬性上標(biāo)注@NotNull、@Max等標(biāo)準(zhǔn)的注解指定校驗(yàn)規(guī)則,并通過(guò)這些標(biāo)準(zhǔn)的驗(yàn)證接口對(duì)Bean進(jìn)行驗(yàn)證。

規(guī)定一些檢驗(yàn)規(guī)范即校驗(yàn)注解,如@Null, @NotNull, @Pattern,位于javax.validation.constraints包下,只提供規(guī)范 不提供實(shí)現(xiàn)。

在Spring中,有兩種方式可以驗(yàn)證輸入,一是利用Spring自帶的驗(yàn)證框架,二是利用JSR-303的實(shí)現(xiàn),一般建議使用JSR-303的實(shí)現(xiàn),比如Hibernate-Validator。

Hibernate-Validator 是JSR-303的實(shí)現(xiàn)。Hibernate Validator提供了JSR-303規(guī)范中所有內(nèi)置constraint的實(shí)現(xiàn),除此之外還有一些附加的constraint,如@Email, @Length, @Range等,位于org.hibernate,validator.constraints包下。

spring-boot-starter-web包里面已經(jīng)有了hibernate-vlidator包,不需要額外引用hibernate validator依賴。

同時(shí)Spring為了給開(kāi)發(fā)者提供便捷,對(duì)Hibernate-Validator進(jìn)行了二次封裝,封裝了LocalValidatorFactorBean作為validator的實(shí)現(xiàn),這個(gè)類兼容了Spring的Validation體系和Hibernate的Validation體系,LocalValidatorFactorBean已經(jīng)成為了Validator的默認(rèn)實(shí)現(xiàn)。

說(shuō)明:JSR-349是JSR-303的升級(jí)版,添加了一些新特性

如下圖,是spring boot 2.1.1中hibernate依賴情況:

常用注解

屬性 描述 舉例
@AssertTrue 應(yīng)用于boolean屬性,該屬性值必須為true

@AssertTrue

boolean isOkay;

@AssertFalse 應(yīng)用于boolean屬性,該屬性值必須為false

@AssertFalse

boolean isOkay;

@DecimalMax 只能小于或等于指定值

@DecimalMax("1.1")

BigDecimal price;

@DecimalMin 只能大于或等于指定值

@DecimalMin("1.1")

BigDecimal price;

@Digits 該屬性值必須在指定范圍內(nèi),interger屬性定義該數(shù)值的最大整數(shù)部分,fraction屬性定義該數(shù)值的最大 小數(shù)部分

@Digits(integer=5, fraction=2)

BigDecimal price;

@Future 檢查該字段是否是屬于未來(lái)的日期

@Future

Date shippingDate;

@Max 該字段的值只能小于或等于該值

@Max(20)

int age;

@Min 該字段的值只能大于或等于該值

@Min(20)

int age;

@NotNull 該字段不能為Null

@NotNull

String name;

@Null 該字段必須是Null

@Null

String dest;

@Past 該字段必須是過(guò)去的一個(gè)日期

@Past

Date birthDate;

@Size 檢查該字段的size是否在min和max之間,可以是字符串、數(shù)組、集合、Map等

@Size(min=2, max=10)

String description;

@Pattern 該屬性值必須與指定的常規(guī)表達(dá)式相匹配

@Pattern(regexp="\\d{3}")

String areaCode;

@NotBlank 只用于String, 不能為Null且trim()之后size>0

@NotBlank

String src;

@NotEmpty 不能為Null,且size>0

@NotEmpty

String src;

@Email 被注釋的元素必須是電子郵箱地址
@Length 被注釋的字符串String 大小必須在指定范圍內(nèi)

@Length(min=6, max=12, message="密碼長(zhǎng)度必須在6~12")

String src;

@Range BigDecimal,BigInteger,CharSequence, byte, short, int, long等原子類型和包裝類型,驗(yàn)證注解的元素值在最小值和最大值之間
@Valid

指定遞歸驗(yàn)證(下篇講)關(guān)聯(lián)的對(duì)象;

如用戶對(duì)象中有個(gè)地址對(duì)象屬性,如果想在驗(yàn)證用戶對(duì)象時(shí)一起驗(yàn)證地址對(duì)象的話,在地址對(duì)象上加@Valid注解即可級(jí)聯(lián)驗(yàn)證

簡(jiǎn)單應(yīng)用舉例

需要檢驗(yàn)的Bean定義:

public class StudentBean implements Serializable{
    @NotBlank(message = "用戶名不能為空")
    private String name;
    @Min(value = 18, message = "年齡不能小于18歲")
    private Integer age;
    @Pattern(regexp = "^((13[0-9])|(14[5,7,9])|(15([0-3]|[5-9]))|(166)|(17[0,1,3,5,6,7,8])|(18[0-9])|(19[8|9]))\\d{8}$", message = "手機(jī)號(hào)格式錯(cuò)誤")
    private String phoneNum;
    @Email(message = "郵箱格式錯(cuò)誤")
    private String email;
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public Integer getAge() {
        return age;
    }
 
    public void setAge(Integer age) {
        this.age = age;
    }
 
    public String getPhoneNum() {
        return phoneNum;
    }
 
    public void setPhoneNum(String phoneNum) {
        this.phoneNum = phoneNum;
    }
 
    public String getEmail() {
        return email;
    }
 
    public void setEmail(String email) {
        this.email = email;
    }
}

返回錯(cuò)誤字段定義:

public class ArgumentsInvalidResponseBean {
    private String argumentName;
    private String exceptionMsg;
 
    public ArgumentsInvalidResponseBean() {
    }
 
    public ArgumentsInvalidResponseBean(String argumentName, String exceptionMsg) {
        this.argumentName = argumentName;
        this.exceptionMsg = exceptionMsg;
    }
 
    public String getArgumentName() {
        return argumentName;
    }
    public void setArgumentName(String argumentName) {
        this.argumentName = argumentName;
    }
 
    public String getExceptionMsg() {
        return exceptionMsg;
    }
    public void setExceptionMsg(String exceptionMsg) {
        this.exceptionMsg = exceptionMsg;
    }
}

全局異常處理:

    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseBody
    public List<ArgumentsInvalidResponseBean> methodArgumentNotValidExceptionHandler(MethodArgumentNotValidException ex){
        System.out.println("===================methodArgumentNotValidExceptionHandler Occur============");
 
        List<ArgumentsInvalidResponseBean> argumentsInvalidResponseBeanList = new ArrayList<>();
        for (FieldError error : ex.getBindingResult().getFieldErrors()){
            ArgumentsInvalidResponseBean bean = new ArgumentsInvalidResponseBean();
            bean.setArgumentName(error.getField());
            bean.setExceptionMsg(error.getDefaultMessage());
 
            argumentsInvalidResponseBeanList.add(bean);
        }
        return argumentsInvalidResponseBeanList;
    }

測(cè)試代碼:

@RestController
public class CheckController {
    @PostMapping("stu")
    public String addStu(@Valid @RequestBody StudentBean studentBean){
        return "add student success";
    }
}

在PostMan中測(cè)試:

注意這里,年齡和郵箱是有錯(cuò)誤的,運(yùn)行后查看返回值,具體如下:

自定義校驗(yàn)

新建注解類 MyConstraint:

@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = MyConstraintValidator.class)
public @interface MyConstraint {
    String message() default "這是一個(gè)自定義注解,檢測(cè)輸入是否大寫(xiě)";
    Class<?>[] groups() default {};
 
    Class<? extends Payload>[] payload() default {};
}

實(shí)現(xiàn)MyConstraintValidator:

public class MyConstraintValidator implements ConstraintValidator<MyConstraint, String> {
    @Override
    public void initialize(MyConstraint constraintAnnotation) {
        System.out.println("+++++++++++++myConstraint init");
    }
 
    @Override
    public boolean isValid(String o, ConstraintValidatorContext constraintValidatorContext) {
        if (!o.equals(o.toUpperCase())){
            System.out.println("輸入信息必須是大寫(xiě)");
            return false;
        }
        return true;
    }
}

當(dāng)輸入信息不是全大寫(xiě)字符時(shí),則檢驗(yàn)不通過(guò)

使用:

在上面StudentBean中加入檢驗(yàn)

  @MyConstraint
  private String className;

測(cè)試:

結(jié)果如下:

這時(shí)說(shuō)明自定義檢驗(yàn)可以工作了

拋出BindException而非MethodArgumentNotValidException

當(dāng)請(qǐng)求中 Content-Type為“application/x-www-form-urlencoded”時(shí),Spring會(huì)把數(shù)據(jù)解析成 web form data而非json,會(huì)使用 FormHttpMessageConverter來(lái)轉(zhuǎn)換post的body 并且異常轉(zhuǎn)為BindException。

如果我們想要Spring把POST數(shù)據(jù)認(rèn)為是json并且使用MappingJackson2HttpMessageConverter來(lái)解析數(shù)據(jù),可以把Content-Type設(shè)置成 application/json

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java排序算法總結(jié)之歸并排序

    Java排序算法總結(jié)之歸并排序

    這篇文章主要介紹了Java排序算法總結(jié)之歸并排序,較為詳細(xì)的分析了歸并排序的原理與java實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2015-05-05
  • 詳述IntelliJ IDEA提交代碼前的 Code Analysis 機(jī)制(小結(jié))

    詳述IntelliJ IDEA提交代碼前的 Code Analysis 機(jī)制(小結(jié))

    本篇文章主要介紹了詳述IntelliJ IDEA提交代碼前的 Code Analysis 機(jī)制(小結(jié)),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-11-11
  • Go并發(fā)編程中使用channel的方法

    Go并發(fā)編程中使用channel的方法

    本文給大家介紹Go并發(fā)編程中使用channel的方法,通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2021-11-11
  • 淺談Java中復(fù)制數(shù)組的方式

    淺談Java中復(fù)制數(shù)組的方式

    這篇文章主要介紹了Java中復(fù)制數(shù)組的幾種方法,需要的朋友可以參考下。
    2017-08-08
  • 詳解Java設(shè)計(jì)模式編程中的依賴倒置原則

    詳解Java設(shè)計(jì)模式編程中的依賴倒置原則

    這篇文章主要介紹了詳解Java設(shè)計(jì)模式中的依賴倒置原則,針對(duì)面對(duì)對(duì)象編程中的抽象的運(yùn)用,需要的朋友可以參考下
    2016-02-02
  • 新手初學(xué)Java集合框架

    新手初學(xué)Java集合框架

    這篇文章主要介紹了JAVA集合框架的相關(guān)知識(shí),文中講解非常細(xì)致,幫助大家更好的理解學(xué)習(xí)JAVA框架,感興趣的朋友快來(lái)了解下,希望能給你帶來(lái)幫助
    2021-07-07
  • 查找native方法的本地實(shí)現(xiàn)函數(shù)native_function詳解

    查找native方法的本地實(shí)現(xiàn)函數(shù)native_function詳解

    JDK開(kāi)放給用戶的源碼中隨處可見(jiàn)Native方法,被Native關(guān)鍵字聲明的方法說(shuō)明該方法不是以Java語(yǔ)言實(shí)現(xiàn)的,而是以本地語(yǔ)言實(shí)現(xiàn)的,Java可以直接拿來(lái)用。這里介紹下查找native方法的本地實(shí)現(xiàn)函數(shù)native_function,感興趣的朋友跟隨小編一起看看吧
    2021-12-12
  • SpringBoot 整合 JMSTemplate的示例代碼

    SpringBoot 整合 JMSTemplate的示例代碼

    這篇文章主要介紹了SpringBoot 整合 JMSTemplate的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • 如何解決java壓縮文件亂碼問(wèn)題

    如何解決java壓縮文件亂碼問(wèn)題

    在本篇文章中我們給大家分享的是一篇關(guān)于java壓縮文件亂碼問(wèn)題的解決辦法,有需要的朋友們可以學(xué)習(xí)下。
    2019-12-12
  • 關(guān)于同一個(gè)service調(diào)用service本身的方法

    關(guān)于同一個(gè)service調(diào)用service本身的方法

    這篇文章主要介紹了關(guān)于同一個(gè)service調(diào)用service本身的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06

最新評(píng)論

翁牛特旗| 应城市| 鄢陵县| 太仆寺旗| 淮北市| 策勒县| 龙海市| 兴城市| 万盛区| 大同市| 石屏县| 融水| 永丰县| 南部县| 区。| 方山县| 邢台市| 游戏| 锡林浩特市| 林州市| 濮阳县| 盘山县| 阳城县| 岱山县| 汾西县| 手游| 且末县| 彝良县| 德安县| 大丰市| 鄂托克旗| 九龙城区| 修文县| 灵宝市| 红桥区| 莒南县| 乌拉特中旗| 阿尔山市| 达孜县| 禹城市| 崇信县|