Spring后端参数校验——自定义校验方式(validation)

开发场景

业务场景:新增文章

基本信息

请求路径:/article

请求方式:POST

接口描述:该接口用于新增文章(发布文章)

请求参数

请求参数格式:application/json

请求参数说明:

参数名称说明类型是否必须备注
title文章标题string1~10个非空字符
content文章正文string
coverImg封面图像地址string必须是url地址
state发布状态string已发布 | 草稿
categoryId文章分类IDnumber

请求数据样例:

{
  "title": "陕西旅游攻略",
  "content": "兵马俑,华清池,法门寺,华山...爱去哪去哪...",
  "coverImg": "https://big-event-gwd.oss-cn-beijing.aliyuncs.com/9bf1cf5b-1420-4c1b-91ad-e0f4631cbed4.png",
  "state": "草稿",
  "categoryId": 2
}

参数校验请求参数中要求必要的信息
此时的参数

技术名词解释——Spring Validation

提示:这里可以添加技术名词解释

Spring 提供的一个参数校验框架,使用预定义的注解完成参数校验

1、引入Spring Validation 起步依赖
2、在参数前面添加@Pattern注解
3、在Controller类上添加@Validated注解

引入依赖
在这里插入图片描述

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

添加注解
在这里插入图片描述

自定义校验

已有的注解不能满足所有的校验需求,特殊的情况需要自定义校验(自定义校验注解)

技术细节

1、自定义注解State
2、自定义校验数据的类StateValidation 实现ConstraintValidator接口
3、 在需要校验的地方使用自定义注解

① 自定义注解State
在这里插入图片描述
② 自定义校验数据的类StateValidation 实现ConstraintValidator接口
在这里插入图片描述
③ 在需要校验的地方使用自定义注解
在这里插入图片描述
④ 传参加@Validated

小结

提示:这里可以添加总结

1.实体参数校验

在这里插入图片描述

2.自定义校验

在这里插入图片描述

完整代码

1、注解State

import com.shisan.validation.StateValidation;
import jakarta.validation.Constraint;
import jakarta.validation.Payload;

import java.lang.annotation.*;

/**
 * @Author:shisan @Date:2024/5/8 21:07
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = {StateValidation.class})
public @interface State {


  // 提供校验的条件,这里只校验是否为已发布或草稿
  String message() default "state参数只能是已发布或草稿";
  // 指定分组
  Class<?>[] groups() default {};
  // 负载
  Class<? extends Payload>[] payload() default {};
}

2、自定义校验数据的类StateValidation 实现ConstraintValidator接口

import com.shisan.anno.State;
import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;

/**
 * @Author:shisan
 * @Date:2024/5/8 21:10
 */
public class StateValidation implements ConstraintValidator<State, String> {
    /**
     *
     * @param value 将来要检验的数据
     * @param constraintValidatorContext
     * @return 如果返回true,则校验通过,否则校验失败
     */
    @Override
    public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) {
        // 提供校验
        if(value == null || value.length() == 0){
            return false;
        }
        if(value.equals("已发布") || value.equals("草稿") ){
            return true;
        }
        return false;
    }
}

3、实体类添加注解

import com.shisan.anno.State;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Pattern;
import lombok.Data;
import org.hibernate.validator.constraints.URL;

import java.time.LocalDateTime;

/**
 * @Author:shisan @Date:2024/5/6 15:32
 */
@Data
public class Article {
  private Integer id; // 主键id
  // 1~10个非空字符串
  @NotEmpty(message = "标题不能为空")
  @Pattern(regexp = "^.{1,10}$", message = "标题格式不正确")
  private String title; // 文章标题

  @NotEmpty(message = "内容不能为空")
  private String content; // 文章内容
  // 必须是url地址
  @NotNull(message = "封面图片不能为空")
  @URL
  private String coverImg; // 封面图片

  @State private String state; // 发布状态 1 发布 0 草稿

  @NotNull(message = "分类不能为空")
  private Integer categoryId; // 文章id

  private Integer createUser; // 发布人id
  private LocalDateTime createTime; // 发布时间
  private LocalDateTime updateTime; // 修改时间
}

4、控制层添加@Validated

import com.shisan.pojo.Article;
import com.shisan.pojo.Result;
import com.shisan.service.ArticleService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

/**
 * @Author:shisan @Date:2024/5/8 10:51
 */
@RestController
@RequestMapping("/article")
@Slf4j
public class ArticleController {

  @Autowired private ArticleService articleService;
  /**
   * 请求路径:/article
   *
   * <p>请求方式:POST
   *
   * <p>接口描述:该接口用于新增文章(发布文章)
   */
  @PostMapping
  public Result addArticle(@RequestBody  @Validated Article article) {
    log.info("新增文章:{}", article);
    return articleService.addArticle(article);
  }
}
  • 27
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值