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

Spring中使用JSR303請(qǐng)求約束判空的實(shí)現(xiàn)

 更新時(shí)間:2020年12月18日 08:34:38   作者:niewj  
這篇文章主要介紹了Spring中使用JSR303請(qǐng)求約束判空的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

 1. 適用場(chǎng)景

有時(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;

@Data
public 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
 */
@Controller
public 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
 */
@Data
public 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)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

扶风县| 同仁县| 成安县| 彝良县| 固安县| 蒲城县| 泸溪县| 历史| 综艺| 象州县| 尚志市| 荃湾区| 那坡县| 鞍山市| 福鼎市| 罗江县| 青川县| 安达市| 南安市| 息烽县| 凤庆县| 凤凰县| 临湘市| 陆丰市| 来凤县| 龙南县| 花垣县| 如东县| 汉阴县| 吐鲁番市| 田东县| 竹山县| 开封市| 建湖县| 苗栗县| 麻阳| 江油市| 锦州市| 东明县| 贺兰县| 南宁市|