文章目录
- 开发场景
- 技术名词解释——Spring Validation
- 自定义校验
- 技术细节
- 小结
- 1.实体参数校验
- 2.自定义校验
- 完整代码
开发场景
业务场景:新增文章
基本信息
请求路径:/article
请求方式:POST
接口描述:该接口用于新增文章(发布文章)
请求参数
请求参数格式:application/json
请求参数说明:
参数名称 | 说明 | 类型 | 是否必须 | 备注 | |
---|---|---|---|---|---|
title | 文章标题 | string | 是 | 1~10个非空字符 | |
content | 文章正文 | string | 是 | ||
coverImg | 封面图像地址 | string | 是 | 必须是url地址 | |
state | 发布状态 | string | 是 | 已发布 | 草稿 | |
categoryId | 文章分类ID | number | 是 |
请求数据样例:
{
"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);
}
}