91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在Spring中利用JSR303約束請求

發布時間:2020-12-18 14:11:52 來源:億速云 閱讀:159 作者:Leah 欄目:開發技術

怎么在Spring中利用JSR303約束請求?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

 1. 適用場景

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

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

  • 實體類加字段約束注解

  • Controller類中@Valid標注啟用(@Validated也兼容@Valid)

  • BindingResult獲取報錯信息

2.1 實體類加字段約束注解

如我們要收集前端表單的字段數據到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自動轉換為目標java類型:

  • 如果前端 Content-Type為application/json, 就使用 JSON消息轉換器 幫你轉為JSON對象;

  • 如果前端 Content-Type為application/xml, 就使用 XML消息轉換器 幫你轉為xml;

  • 如果前端 Content-Type為text/plain, 就是用 String消息轉換器 幫你轉成 String; (只有類型為String時才可以轉換)

2.2.2 Result.java:

package com.niewj.demo.common;

import lombok.Data;

import java.io.Serializable;
import java.util.Map;

/**
 * 返回結果模板封裝
 *
 * @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;

/**
 * 通用響應碼
 */
public enum ResponseEnum {

  SUCCESS(200, "成功"),
  BAD_REQUEST(400, "請求參數不合規");

  /**
   * 錯誤碼
   */
  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. 調用測試:

http://localhost:8888/test

3.1 請求用例1: 字段為空

header: Content-Type: application/json

{
  "name": "1"
}

響應:

{
  "code": 400,
  "msg": "請求參數不合規",
  "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"
}

響應:

{
  "code": 400,
  "msg": "請求參數不合規",
  "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
}

響應:

{
  "code": 200,
  "msg": "成功",
  "data": {
    "name": "1234",
    "age": 40,
    "logo": "http://niewj.com",
    "hobbies": [
      "running"
    ],
    "mail": "hi@niewj.com"
  }
}

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

平原县| 金湖县| 砀山县| 冷水江市| 内江市| 沽源县| 新竹县| 博野县| 雷山县| 漳浦县| 黄大仙区| 东兰县| 通化市| 双柏县| 鸡西市| 邛崃市| 洛浦县| 海安县| 永春县| 衡阳县| 化州市| 沙湾县| 香河县| 本溪市| 灌阳县| 瓮安县| 新竹县| 昌都县| 黎川县| 济阳县| 密云县| 佛学| 黔西| 桓仁| 大新县| 襄樊市| 龙游县| 静海县| 浏阳市| 浑源县| 九寨沟县|