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

Spring中使用JSR303請求約束判空的實現(xiàn)

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

 1. 適用場景

有時候我們在表單里提交一系列參數(shù), 到后臺封裝成一個對象, 要對對象的屬性做各種字段值的約束; 這時候, 當(dāng)然可以if-else一個一個的判斷, 有更簡潔的做法, 就是使用 JSR303+spring的validation:

2. 使用方法步驟(分3步)

  • 實體類加字段約束注解
  • Controller類中@Valid標注啟用(@Validated也兼容@Valid)
  • BindingResult獲取報錯信息

2.1 實體類加字段約束注解

如我們要收集前端表單的字段數(shù)據(jù)到Person實體中:

對需要約束的字段進行注解標注;

示例:

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屬性可以修改默認錯誤說明

2.2 Controller類中@Valid標注啟用(@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中的請求流信息(Request.getInputStream)通過HttpMessageConverter自動轉(zhuǎn)換為目標java類型:

  • 如果前端 Content-Type為application/json, 就使用 JSON消息轉(zhuǎn)換器 幫你轉(zhuǎn)為JSON對象;
  • 如果前端 Content-Type為application/xml, 就使用 XML消息轉(zhuǎn)換器 幫你轉(zhuǎn)為xml;
  • 如果前端 Content-Type為text/plain, 就是用 String消息轉(zhuǎn)換器 幫你轉(zhuǎn)成 String; (只有類型為String時才可以轉(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, "請求參數(shù)不合規(guī)");

  /**
   * 錯誤碼
   */
  private Integer code;
  /**
   * 錯誤信息
   */
  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獲取報錯信息

  • BindingResult用來收集約束字段的錯誤信息, 可通過 bindingResult.hasErrors()的 true來過濾錯誤信息;
  • bindingResult.getFieldErrors() 會返回 List<FieldError>;
  • FieldError 得到字段名: getField(); 得到錯誤信息: getDefaultMessage()

3. 調(diào)用測試:

http://localhost:8888/test

3.1 請求用例1: 字段為空

header: Content-Type: application/json

{
  "name": "1"
}

響應(yīng):

{
  "code": 400,
  "msg": "請求參數(shù)不合規(guī)",
  "data": {
    "mail": "email不能為空!",
    "hobbies": "hobbies不能為空",
    "name": "長度需要在4和10之間",
    "logo": "不能為空",
    "age": "age不能為空"
  }
}

3.2 請求用例2: list無元素/email/url格式不對

header: Content-Type: application/json

{
  "name": "1234",
  "hobbies": [],
  "mail": "niewj",
  "logo": "niewj.com"
}

響應(yīng):

{
  "code": 400,
  "msg": "請求參數(shù)不合規(guī)",
  "data": {
    "mail": "不是一個合法的電子郵件地址",
    "hobbies": "hobbies不能為空",
    "logo": "logo必須是URL格式",
    "age": "age不能為空"
  }
}

3.3 請求用例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請求約束判空的實現(xiàn)的文章就介紹到這了,更多相關(guān)Spring JSR303請求約束判空內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

汝州市| 北安市| 岫岩| 灵寿县| 合作市| 木兰县| 文化| 芜湖市| 安宁市| 时尚| 监利县| 迁安市| 高淳县| 寿宁县| 宁明县| 西充县| 称多县| 泸水县| 黔南| 名山县| 卢龙县| 铁岭县| 永定县| 莱西市| 上饶市| 崇阳县| 石河子市| 许昌市| 日照市| 天柱县| 项城市| 桐城市| 房山区| 碌曲县| 剑河县| 泰州市| 馆陶县| 合山市| 信丰县| 都安| 安平县|