目录
1.1ArticleController创建
package com.itheima.controller;
import com.itheima.pojo.Article;
import com.itheima.pojo.Result;
import com.itheima.service.ArticleService;
import com.itheima.utils.JwtUtil;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.Map;
@RestController
@RequestMapping("/article")
public class ArticleController {
@Autowired
private ArticleService articleService;
@PostMapping
public Result add(@RequestBody Article article){
articleService.add(article);
return Result.success();
}
}
1.2ArticleService
package com.itheima.service;
import com.itheima.pojo.Article;
public interface ArticleService {
//新增文章
void add(Article article);
}
ArticleServiceImpl
package com.itheima.service.impl;
import com.itheima.mapper.ArticleMapper;
import com.itheima.pojo.Article;
import com.itheima.service.ArticleService;
import com.itheima.utils.ThreadLocalUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.Map;
@Service
public class ArticleServiceImpl implements ArticleService {
@Autowired
private ArticleMapper articleMapper;
@Override
public void add(Article article) {
//补充属性值
article.setCreateTime(LocalDateTime.now());
article.setUpdateTime(LocalDateTime.now());
Map<String,Object> map = ThreadLocalUtil.get();
Integer userId= (Integer) map.get("id");
article.setCreateUser(userId);
articleMapper.add(article);
}
}
1.3ArticleMapper
package com.itheima.mapper;
import com.itheima.pojo.Article;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface ArticleMapper {
//新增
@Insert("insert into article(title,content,cover_img,state,category_id,create_user,create_time,update_time)"+
"values(#{title},#{content},#{coverImg},#{state},#{categoryId},#{createUser},#{createTime},#{updateTime})")
void add(Article article);
}
2.1测试
3.1参数校验
3.1.1实体类中添加注解
package com.itheima.pojo;
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;
@Data
public class Article {
private Integer id;//主键ID
@NotEmpty
@Pattern(regexp = "^\\S{1,10}$")
private String title;//文章标题
@NotEmpty
private String content;//文章内容
@NotEmpty
@URL
private String coverImg;//封面图像
private String state;//发布状态 已发布|草稿
@NotNull
private Integer categoryId;//文章分类id
private Integer createUser;//创建人ID
private LocalDateTime createTime;//创建时间
private LocalDateTime updateTime;//更新时间
}
3.1.2控制器中添加Valtion注解
public Result add(@RequestBody @Validated Article article){
articleService.add(article);
return Result.success();
}
3.1.3测试
将标题设置为空
4.1自定义校验
已有的注解不能满足校验需求,特殊的情况要自定义校验(自定义校验注解)
(1)自定义注解State
(2)自定义校验数据的类StateValidation实现ConstraintValidator接口
(3)在需要校验位地方使用自定义注解
4.1.1
创建一个包用于存放自定义注解,再创建一个类
package com.itheima.anno;
import jakarta.validation.Constraint;
import jakarta.validation.Payload;
import java.lang.annotation.*;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Documented//元注解
@Target({FIELD})//元注解
@Retention(RUNTIME)//元注解
@Constraint(validatedBy = {})
public @interface State {
//提供校验失败后的提示信息
String message() default "state参数的值只能是已发布或者草稿";
//指定分组
Class<?>[] groups() default {};
//负载 获取到State注解的附加信息
Class<? extends Payload>[] payload() default {};
}
4.1.2
新创建一个包和一个类,这个类需要实现一个接口
package com.itheima.validation;
import com.itheima.anno.State;
import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;
public class StateValidation implements ConstraintValidator<State,String> {
/**
* @param value 将来要校验的数据
* @param context context in which the constraint is evaluated
* @return 如果返回false, 则校验不通过,如果返回true,则校验通过
*/
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
//提供规则
if (value == null) {
return false;
}
if (value.equals("已发布") || value.equals("草稿")) {
return true;
}
return false;
}
}
4.1.3进行整合将其赋值
State.java
package com.itheima.anno;
import com.itheima.validation.StateValidation;
import jakarta.validation.Constraint;
import jakarta.validation.Payload;
import java.lang.annotation.*;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Documented//元注解
@Target({FIELD})//元注解
@Retention(RUNTIME)//元注解
@Constraint(validatedBy = {StateValidation.class})//指定提供校验规则的类
public @interface State {
//提供校验失败后的提示信息
String message() default "state参数的值只能是已发布或者草稿";
//指定分组
Class<?>[] groups() default {};
//负载 获取到State注解的附加信息
Class<? extends Payload>[] payload() default {};
}
实体类
@State
private String state;//发布状态 已发布|草稿
5.1测试
5.1.1
修改数据
5.1.2
修改测试数据
自定义校验规则生效
总结:自定义校验
(1)自定义注解State
message/groups/payload
(2)自定义校验数据的类StateValidation
(3)在需要校验的地方使用自定义注解