天天看點

SpringCloud微服務實戰——搭建企業級開發架構(八):使用注解校驗微服務消息參數

  平時開發過程中,經常要用到參數校驗,如果直接在代碼邏輯裡面寫參數校驗,代碼有點備援且用起來不是非常友善,顯得代碼邏輯複雜且重複代碼太多,這裡我們使用注解的方式進行參數校驗,SpringBoot中常用的用于參數校驗的注解如下:

@AssertFalse 所注解的元素必須是Boolean類型,且值為false
@AssertTrue 所注解的元素必須是Boolean類型,且值為true
@DecimalMax 所注解的元素必須是數字,且值小于等于給定的值
@DecimalMin 所注解的元素必須是數字,且值大于等于給定的值
@Digits 所注解的元素必須是數字,且值必須是指定的位數
@Future 所注解的元素必須是将來某個日期
@Max 所注解的元素必須是數字,且值小于等于給定的值
@Min 所注解的元素必須是數字,且值小于等于給定的值
@Range 所注解的元素需在指定範圍區間内
@NotNull 所注解的元素值不能為null
@NotBlank 所注解的元素值有内容
@Null 所注解的元素值為null
@Past 所注解的元素必須是某個過去的日期
@PastOrPresent 所注解的元素必須是過去某個或現在日期
@Pattern 所注解的元素必須滿足給定的正規表達式
@Size 所注解的元素必須是String、集合或數組,且長度大小需保證在給定範圍之内
@Email 所注解的元素需滿足Email格式
           

1、在GitEgg-Platform工程的子工程gitegg-platform-boot裡添加spring-boot-starter-validation依賴,因為自SpringBoot2.3.X開始spring-boot-starter-web預設不再引入校驗架構,這裡需要手動引入,pom.xml如下

<!--?xml version="1.0" encoding="UTF-8"?-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactid>GitEgg-Platform</artifactid>
        <groupid>com.gitegg.platform</groupid>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelversion>4.0.0</modelversion>

    <artifactid>gitegg-platform-boot</artifactid>
    <name>${project.artifactId}</name>
    <version>${project.parent.version}</version>
    <packaging>jar</packaging>

    <dependencies>
        <dependency>
            <groupid>org.springframework.boot</groupid>
            <artifactid>spring-boot-starter-web</artifactid>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupid>org.springframework.boot</groupid>
            <artifactid>spring-boot-starter-validation</artifactid>
        </dependency>
        <dependency>
            <groupid>com.gitegg.platform</groupid>
            <artifactid>gitegg-platform-swagger</artifactid>
            <optional>true</optional>
        </dependency>
    </dependencies>

</project>
           

2、GitEgg-Platform工程重新install,在GitEgg-Cloud工程的子工程gitegg-service-system裡面建立類SystemDTO.java

package com.gitegg.service.system.dto;

import lombok.Data;

import javax.validation.constraints.*;

@Data
public class SystemDTO {

    @NotNull
    @Min(value = 10, message = "id必須大于10")
    @Max(value = 150, message = "id必須小于150")
    private Long id;

    @NotNull(message = "名稱不能為空")
    @Size(min = 3, max = 20, message = "名稱長度必須在3-20之間")
    private String name;
}

           
package com.gitegg.service.system.controller;

import com.gitegg.platform.boot.common.base.Result;
import com.gitegg.platform.boot.common.exception.BusinessException;
import com.gitegg.service.system.dto.SystemDTO;
import com.gitegg.service.system.service.ISystemService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;

@RestController
@RequestMapping(value = "system")
@AllArgsConstructor
@Api(tags = "gitegg-system")
public class SystemController {

    private final ISystemService systemService;

    @GetMapping(value = "list")
    @ApiOperation(value = "system list接口")
    public Object list() {
        return systemService.list();
    }


    @GetMapping(value = "page")
    @ApiOperation(value = "system page接口")
    public Object page() {
        return systemService.page();
    }

    @GetMapping(value = "exception")
    @ApiOperation(value = "自定義異常及傳回測試接口")
    public Result<string> exception() {
        return Result.data(systemService.exception());
    }

    @PostMapping(value = "valid")
    @ApiOperation(value = "參數校驗測試接口")
    public Result<systemdto> valid(@Valid @RequestBody SystemDTO systemDTO) {
        return Result.data(systemDTO);
    }
}

           
/**
     * 非法請求-參數校驗
     */
    @ExceptionHandler(value = {MethodArgumentNotValidException.class})
    public Result handlerMethodArgumentNotValidException(MethodArgumentNotValidException methodArgumentNotValidException) {
        //擷取異常字段及對應的異常資訊
        StringBuffer stringBuffer = new StringBuffer();
        methodArgumentNotValidException.getBindingResult().getFieldErrors().stream()
                .map(t -> t.getField() + t.getDefaultMessage() + ";")
                .forEach(e -> stringBuffer.append(e));
        String errorMessage = stringBuffer.toString();
        Result result = Result.error(ResultCodeEnum.PARAM_VALID_ERROR, errorSystem + errorMessage);
        return result;
    }