SpringCloud微服务实战——搭建企业级开发框架(八):使用注解校验微服务消息参数

  平时开发过程中,经常要用到参数校验,如果直接在代码逻辑里面写参数校验,代码有点冗余且用起来不是非常方便,显得代码逻辑复杂且重复代码太多,微服务校验常用的方式有:

  1. 数据库约束:在数据库中设置数据的相关约束,如字段长度、类型等,来确保数据的正确性。

  2. 后端校验:在后端进行数据的校验,如参数校验、业务校验等,来确保数据的合法性。

  3. 前端校验:在前端进行数据的校验,如表单校验、数据格式校验等,来确保用户输入数据的正确性。

  4. 消息队列校验:在消息队列中,对消息进行校验,确保消息的内容符合业务要求,以保证后续的流程的正确性。

  5. API 校验:对 API 接口进行校验,确保 API 接口的参数格式、数据类型、合法性等,以保证系统的稳定性和安全性。

使用Spring Boot的注解校验能够带来以下优势:
  1. 方便快捷:使用注解校验可以简单地将校验规则与被校验对象绑定在一起,无需手动编写复杂的校验逻辑。

  2. 高效可靠:使用注解校验可以快速发现校验错误,有效增加应用程序的可靠性。注解校验是在Java Bean Validation API的基础上开发的,可靠性有保证。

  3. 代码简洁:使用注解校验可以省去大量的校验代码,大大减少了代码量。

  4. 易于维护:使用注解校验可以有效降低代码的复杂度,使得代码容易维护和修改。

  5. 可扩展性:使用注解校验可以通过自定义注解实现更为复杂的校验规则,增强了校验的灵活性和可扩展性。

这里我们使用注解的方式进行参数校验,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;
}

3、SystemController.java类里面添加参数校验测试接口

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);
    }
}

4、运行GitEggSystemApplication.java,打开浏览器访问:http://127.0.0.1:8001/doc.html,然后点击左侧的参数校验测试接口,使用Swagger2进行测试,即可查看校验结果
image.png
5、这里的提示信息用到了上一章节讲到的统一异常处理逻辑:

    /**
     * 非法请求-参数校验
     */
    @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;
    }

后台服务参数校验的必要性主要有以下几点:

  1. 数据合法性:参数校验能够确保传入后台服务的数据是合法的,有效的,符合业务规则的数据。如果参数校验没有被执行,可能会导致后续的业务逻辑出错。

  2. 安全性:参数校验能够防止恶意攻击和非法操作。例如,对于一个需要登录权限的后台服务,如果没有对用户的身份进行验证,则可能会出现一些不可预料的问题。

  3. 性能优化:参数校验能够提高后台服务的性能,避免不必要的计算和存储操作,减少后台服务的负载压力和响应时间。

  4. 易维护性:参数校验能够降低代码维护成本,减少代码中的冗余判断和错误处理等代码。这有助于维护和优化代码。

本文源码在https://gitee.com/wmz1930/GitEgg的chapter-08分支。

GitEgg-Cloud是一款基于SpringCloud整合搭建的企业级微服务应用开发框架,开源项目地址:

Gitee: https://gitee.com/wmz1930/GitEgg
GitHub: https://github.com/wmz1930/GitEgg

欢迎感兴趣的小伙伴Star支持一下。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

全栈程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值