spring boot 12

一、自定义校验(@State 注解)

1. 自定义注解 @State

用于校验文章状态是否为 已发布草稿

java

运行

复制代码
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = StateValidation.class)
public @interface State {
    // 校验失败的提示信息
    String message() default "文章状态只能是:已发布或者草稿";

    // 分组校验支持
    Class[] groups() default {};

    // 负载信息
    Class<? extends Payload>[] payload() default {};
}

2. 校验逻辑实现类 StateValidation

实现 ConstraintValidator 接口,编写具体校验规则:

java

运行

复制代码
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

public class StateValidation implements ConstraintValidator<State, String> {

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        // 状态不能为空
        if (value == null) {
            return false;
        }
        // 校验是否为允许的状态值
        return value.equals("已发布") || value.equals("草稿");
    }
}

3. 在实体类中使用 @State 注解

java

运行

复制代码
@Data
public class Article {
    private Integer id; // 主键ID

    @NotEmpty(message = "文章标题不能为空")
    private String title; // 文章标题

    @NotEmpty(message = "文章内容不能为空")
    private String content; // 文章内容

    private String coverImg; // 封面图像

    @State(message = "文章状态只能是:已发布或者草稿")
    private String state; // 发布状态:已发布/草稿

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

    private Integer createUser; // 创建人ID
    private LocalDateTime createTime; // 创建时间
    private LocalDateTime updateTime; // 更新时间
}

二、新增文章接口实现

1. Controller 层

java

运行

复制代码
@RestController
@RequestMapping("/article")
public class ArticleController {
    @Autowired
    private ArticleService articleService;

    @PostMapping
    public Result add(@RequestBody @Validated Article article) {
        articleService.add(article);
        return Result.success();
    }
}

2. Service 层

java

运行

复制代码
@Service
public class ArticleServiceImpl implements ArticleService {
    @Autowired
    private ArticleMapper articleMapper;

    @Override
    public void add(Article article) {
        // 从 ThreadLocal 获取当前登录用户ID
        Map<String, Object> claims = ThreadLocalUtil.get();
        Integer userId = (Integer) claims.get("id");
        
        // 自动填充字段
        article.setCreateUser(userId);
        LocalDateTime now = LocalDateTime.now();
        article.setCreateTime(now);
        article.setUpdateTime(now);
        
        articleMapper.add(article);
    }
}

3. Mapper 层(SQL)

java

运行

复制代码
@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);
}

三、关键注意事项

  1. 自定义校验生效条件

    • 自定义注解上添加 @Constraint(validatedBy = StateValidation.class),关联校验实现类
    • 实体类字段上添加 @State 注解
    • Controller 接口参数前添加 @Validated 注解,开启校验
  2. 新增文章接口字段校验

    • title:非空校验(@NotEmpty
    • content:非空校验(@NotEmpty
    • categoryId:非空校验(@NotNull
    • state:自定义校验(@State),必须为 已发布草稿
  3. 用户 ID 安全获取

    • 不要由前端传入 createUser,统一从 ThreadLocal 中获取,避免越权发布文章
  4. 时间字段自动填充

    • 新增时 createTimeupdateTime 都设置为当前时间,保证数据一致性
相关推荐
隔壁大炮10 小时前
MNE-Python 第5天学习笔记:数据预处理(二)—— 伪迹处理
python·eeg·mne·脑电数据处理
Brilliantwxx10 小时前
【C++】 认识STL set与map(基础接口+题目OJ运用)
开发语言·数据结构·c++·笔记·算法
码界筑梦坊10 小时前
141-基于FLask的骑行装备销售订单数据可视化分析系统
python·信息可视化·数据分析·flask·毕业设计·echarts
罗超驿10 小时前
21.jdbc 学习笔记:从原理到实践的全流程梳理
java·数据库·mysql·面试
Huangjin007_10 小时前
【C++ STL篇(十一)】深入浅出红黑树:从原理到实现,一篇搞定
开发语言·c++
Mahir0810 小时前
Spring 全家桶常见注解全解:从入门到精通
java·后端·spring·面试·常见注解
fqbqrr10 小时前
2605C++,C++继承类实现调试器
开发语言·c++
阿里嘎多学长10 小时前
2026-05-21 GitHub 热点项目精选
开发语言·程序员·github·代码托管
wjs202410 小时前
PHP 面向对象编程(OOP)深入解析
开发语言