文章目录
- 开发场景
- 技术名词解释——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,则校验通过,否则校验失败*/@Overridepublic 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 = "封面图片不能为空")@URLprivate String coverImg; // 封面图片@State private String state; // 发布状态 1 发布 0 草稿@NotNull(message = "分类不能为空")private Integer categoryId; // 文章idprivate Integer createUser; // 发布人idprivate 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>接口描述:该接口用于新增文章(发布文章)*/@PostMappingpublic Result addArticle(@RequestBody @Validated Article article) {log.info("新增文章:{}", article);return articleService.addArticle(article);}
}