Spring Boot 笔记 017 创建接口_新增文章

1.1实体类增加校验注释

1.1.1 自定义校验

1.1.1.1 自定义注解

package com.geji.anno;import com.geji.validation.StateValidation;
import jakarta.validation.Constraint;
import jakarta.validation.Payload;
import jakarta.validation.constraints.NotEmpty;import java.lang.annotation.Documented;
import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.ElementType.TYPE_USE;
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 { };
}

1.1.1.2 自定义校验类

package com.geji.validation;import com.geji.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,则校验通过*/@Overridepublic boolean isValid(String value, ConstraintValidatorContext context) {//提供校验规则if (value == null){return false;}if (value.equals("已发布") || value.equals("草稿")){return true;}return false;}
}

1.1.1.3 在需要的地方使用注解

package com.geji.pojo;import com.geji.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;@Data
public class Article {private Integer id;//主键ID@NotEmpty@Pattern(regexp = "^\\S{1,10}$")private String title;//文章标题@NotEmptyprivate String content;//文章内容@NotEmpty@URLprivate String coverImg;//封面图像@Stateprivate String state;//发布状态 已发布|草稿@NotNullprivate Integer categoryId;//文章分类idprivate Integer createUser;//创建人IDprivate LocalDateTime createTime;//创建时间private LocalDateTime updateTime;//更新时间
}

1.1 Controller

package com.geji.controller;import com.geji.pojo.Article;
import com.geji.pojo.Result;
import com.geji.service.ArticleService;
import com.geji.utils.JwtUtil;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;@RestController
@RequestMapping("/article")
public class ArticleController {@Autowiredprivate ArticleService articleService;@PostMappingpublic Result add(@RequestBody @Validated Article article) {articleService.add(article);return Result.success();}
}

1.2 Service

package com.geji.service;import com.geji.pojo.Article;public interface ArticleService {void add(Article article);
}

1.3 ServiceImpl

package com.geji.service.impl;import com.geji.mapper.ArticleMapper;
import com.geji.pojo.Article;
import com.geji.service.ArticleService;
import com.geji.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 {@Autowiredprivate ArticleMapper articleMapper;@Overridepublic 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.4 Mapper

package com.geji.mapper;import com.geji.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);}

1.5 Postman测试

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/683786.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何使用 Python 通过代码创建图表

简介 Diagram as Code 工具允许您创建基础架构的架构图。您可以重复使用代码、测试、集成和自动化绘制图表的过程&#xff0c;这将使您能够将文档视为代码&#xff0c;并构建用于映射基础架构的流水线。您可以使用 diagrams 脚本与许多云提供商和自定义基础架构。 在本教程中…

Qt:自定义信号,信号emit,传参问题,信号槽与moc

一、自定义信号&#xff0c;信号emit 1、自定义信号 在头文件中 加入signals&#xff1a; 就可以编写信号 2、emit emit的作用是通知信号发生 二、跨UI控件传参 每次按Dialog添加按钮主控件数字会增长 // .h private slots:void on_btnAdd_clicked(); signals:void sign…

《区块链公链数据分析简易速速上手小册》第8章:实战案例研究(2024 最新版)

文章目录 8.1 案例分析&#xff1a;投资决策支持8.1.1 基础知识8.1.2 重点案例&#xff1a;股票市场趋势预测准备工作实现步骤步骤1: 加载和准备数据步骤2: 特征工程步骤3: 训练模型步骤4: 评估模型 结论 8.1.3 拓展案例 1&#xff1a;基于情感分析的投资策略准备工作实现步骤步…

C# winfrom中NPOI操作EXCEL

前言 1.整个Excel表格叫做工作表&#xff1a;WorkBook&#xff08;工作薄&#xff09;&#xff0c;包含的叫页&#xff08;工作表&#xff09;&#xff1a;Sheet&#xff1b;行&#xff1a;Row&#xff1b;单元格Cell。 2.忘了告诉大家npoi是做什么的了&#xff0c;npoi 能够读…

Node.js开发-fs模块

这里写目录标题 fs模块1) 文件写入2) 文件写入3) 文件移动与重命名4) 文件删除5) 文件夹操作6) 查看资源状态7) 相对路径问题8) __dirname fs模块 fs模块可以实现与硬盘的交互&#xff0c;例如文件的创建、删除、重命名、移动等&#xff0c;还有文件内容的写入、读取&#xff…

每日五道java面试题之java基础篇(八)

目录&#xff1a; 第一题.CopyOnWriteArrayList的底层原理是怎样的第二题.Java中有哪些类加载器第三题. 说说类加载器双亲委派模型第四题. GC如何判断对象可以被回收第五题.JVM中哪些是线程共享区 第一题.CopyOnWriteArrayList的底层原理是怎样的 ⾸先CopyOnWriteArrayList内部…

游戏开发的编程算不算是IT行业中难度最大的?

游戏开发的编程算不算是IT行业中难度最大的&#xff1f; 游戏作为当今数字娱乐领域中最引人入胜的产品之一&#xff0c;其背后所依托的程序开发能力也备受关注。作为游戏开发过程中的“幕后英雄”&#xff0c;编程工作的难易程度直接影响到游戏的质量体验和开发效率。 关于游…

如何在 Angular 中将特定按键绑定到 keyup 和 keydown 事件

简介 当在 Angular 2 模板中绑定 keyup 或 keydown 事件时&#xff0c;可以指定 键名。这将应用一个过滤器&#xff0c;只有在按下特定键时才会触发事件。 在本文中&#xff0c;您将学习如何在监听 keyup 和 keydown 事件时使用键名。 使用键名 首先&#xff0c;让我们看一…

Python 装饰器的学习笔记

Python 装饰器的学习笔记 0. Python 装饰器的说明1. 装饰器的基本结构2. 使用装饰器3. 带参数的装饰器4. 类装饰器 0. Python 装饰器的说明 装饰器是Python中一个非常强大的功能&#xff0c;它允许程序员扩展或修改函数的行为而不改变函数本身的代码。装饰器本质上是一个接受函…

Python dict函数

Python中的字典&#xff08;dict&#xff09;是一种非常重要且灵活的数据结构&#xff0c;它提供了键值对的存储和访问机制。字典函数&#xff08;dict()&#xff09;作为创建字典的工具之一&#xff0c;可以从多种数据结构中创建字典对象。在本文中&#xff0c;将深入探讨dict…

2.15数据结构与算法学习日记(分治,二分)

洛谷P1296 奶牛的耳语 题目描述 在你的养牛场&#xff0c;所有的奶牛都养在一排呈直线的牛栏中。一共有 &#xfffd;n 头奶牛&#xff0c;其中第 &#xfffd;i 头牛在直线上所处的位置可以用一个整数坐标 &#xfffd;&#xfffd;(0≤&#xfffd;&#xfffd;≤108)pi​(…

算法刷题:有效三角形个数

有效三角形个数 .题目链接题目详情算法原理补充知识点双指针:对撞指针 我的答案 . 题目链接 有效三角形个数 题目详情 算法原理 补充知识点 有效三角形需要满足的条件: ab>cac>bbc>a 其实在满足1的时候,c是最大的,那么2和3是显然成立的,因此我们可以这样解题: 对…

华为OD机试 - 分配土地( Python C C++ JavaGo JS PHP)

题目描述 从前有个村庄&#xff0c;村民们在各种田地上插上小旗子&#xff0c;每个旗子上都标识了一个数字。现在&#xff0c;村民们想要找出一个包含相同数字的最小矩形区域&#xff0c;并将这块土地分配给对村庄做出巨大贡献的村民。我们需要找出这个矩形区域的最大面积。 …

知识图谱简单介绍

知识图谱&#xff08;Knowledge Graph&#xff09;是一种用于表达实体、概念及其之间关系的图形数据结构。它通过将现实世界中的各种概念、实体和关系以图形的形式组织起来&#xff0c;实现对知识的表示、存储和推理。知识图谱在许多领域都有广泛的应用&#xff0c;如搜索引擎、…

分享个CSDN自定义模块模板

在开了会员或升级为博客专家后&#xff0c;才有这个自定义模块的权限 当然这也是为了有很多粉丝的博主更方便的推广一些业务场景展示的橱窗 自定义模块管理 下面就列下我使用的自定义模块相关的代码 <marquee><b><font color"#8A2BE2">不</…

[WinForm开源]概率计算器 - Genshin Impact(V1.0)

创作目的&#xff1a;为方便旅行者估算自己拥有的纠缠之缘能否达到自己的目的&#xff0c;作者使用C#开发了一款小型软件供旅行者参考使用。 创作说明&#xff1a;此软件所涉及到的一切概率与规则完全按照游戏《原神》(V4.4.0)内公示的概率与规则&#xff08;包括保底机制&…

代码随想录 -- 数组

文章目录 二分查找题目描述题解 移除元素题目描述题解&#xff1a;暴力解法题解&#xff1a;双指针法 有序数组的平方题目描述题解&#xff1a;暴力解法题解&#xff1a;双指针法 长度最小的子数组题目描述题解&#xff1a;暴力解法题解&#xff1a;滑动窗口&#xff08;双指针…

猫头虎分享已解决Bug || DNS解析问题(DNS Resolution Issue):DNSLookupFailure, DNSResolveError

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

学习Spring的第十八天

注解方式配值声明式事务控制 直接上源码配置类 package com.itheima.config;import com.alibaba.druid.pool.DruidDataSource; import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.facto…

作业2.12

1.会出现段错误&#xff0c;因为p申请的堆区内存未返回给str&#xff0c;导致str仍然指向NULL&#xff0c;无法将"hello world"拷贝给str 2.会出现段错误&#xff0c;因为p是一个局部变量&#xff0c;函数结束时&#xff0c;p将被释放&#xff0c;不能返回它的地址&…