行业资讯
📅 2026/7/23 5:29:48
SpringBoot个人笔记01--大事件项目
SpringBoot3实战开发模式与环境搭建明确需求阅读接口文档思路分析开发测试执行脚本准备数据库表创建springboot工程引入对应的依赖web, mybatis, mysql驱动配置application.yml中引入mybatisi的配置信息创建包结构准备实体类projectxmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersion!--配置点1 parent--parentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion3.1.3/version/parent!--/1--groupIdorg.example/groupIdartifactIdbig-event/artifactIdversion1.0-SNAPSHOT/versionpackagingjar/packagingnamebig-event/nameurlhttp://maven.apache.org/urlpropertiesproject.build.sourceEncodingUTF-8/project.build.sourceEncoding/propertiesdependencies!--配置点2--!-- 引入web依赖--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId!-- version3.3.2/version--/dependency!-- mybatis依赖--dependencygroupIdorg.mybatis.spring.boot/groupIdartifactIdmybatis-spring-boot-starter/artifactIdversion3.0.0/version/dependencydependencygroupIdcom.mysql/groupIdartifactIdmysql-connector-j/artifactId/dependency!--添加lombok依赖--dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactId/dependency!--/2--/dependencies/project遇到的问题没变成绿叶是parent这个依赖写错了开发用户接口注册参数检验添加validation依赖在需要校验的参数前添加Pattern()并在类上添加Validated注解publicResultregister(Pattern(regexp^\\${5,16})Stringusername,Pattern(regexp^\\${5,16})Stringpassword)参数校验失败异常处理在全局异常处理器中处理参数校验失败的异常创建exception包写GlobalExceptionHandler类packagecom.yanxi.exception;importcom.yanxi.pojo.Result;importorg.springframework.util.StringUtils;importorg.springframework.web.bind.annotation.ExceptionHandler;importorg.springframework.web.bind.annotation.RestControllerAdvice;RestControllerAdvicepublicclassGlobalExceptionHandler{ExceptionHandler(Exception.class)publicResulthandleException(Exceptione){e.printStackTrace();returnResult.error(StringUtils.hasLength(e.getMessage())?e.getMessage():操作失败);//注意引用的是spring包}}登录登录认证-JWT令牌JSON Web Token定义了一种简洁的、自包含的格式用于通信双方以json数据格式安全的传输信息添加jwt与测试依赖!-- 单元测试坐标spring-boot--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactId/dependencydependency!-- java-jwt坐标--groupIdcom.auth0/groupIdartifactIdjava-jwt/artifactIdversion4.4.0/version/dependency使用packagecom.yanxi;importcom.auth0.jwt.JWT;importcom.auth0.jwt.JWTVerifier;importcom.auth0.jwt.algorithms.Algorithm;importcom.auth0.jwt.interfaces.Claim;importcom.auth0.jwt.interfaces.DecodedJWT;importorg.junit.jupiter.api.Test;importjava.util.Base64;importjava.util.Date;importjava.util.HashMap;importjava.util.Map;/** * Unit test for simple App. */publicclassAppTest{TestpublicvoidtestGen(){MapString,ObjectclaimsnewHashMap();claims.put(id,1);claims.put(username,张三);//生成jwt代码StringtokenJWT.create().withClaim(user,claims)//添加载荷.withExpiresAt(newDate(System.currentTimeMillis()1000*60*60*12))//添加过期时间.sign(Algorithm.HMAC256(yanxi));System.out.println(token);}TestpublicvoidtestParse(){//自定义字符串模拟用户传递过来的TokenStringtokeneyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjp7ImlkIjoxLCJ1c2VybmFtZSI6IuW8oOS4iSJ9LCJleHAiOjE3ODQ2MDQwMTN9.g-VfmqlqossszHlmgPeny1KW_MpuYN0OW9rV8uCHB8I;JWTVerifierjwtVerifierJWT.require(Algorithm.HMAC256(yanxi)).build();DecodedJWTdecodedJWTjwtVerifier.verify(token);//验证token,生成一个解析后的JWT对象MapString,ClaimclaimsdecodedJWT.getClaims();System.out.println(claims.get(user));//}}解析令牌抛出异常就证明令牌被篡改或者过期了。获取用户详细信息下划线与驼峰命名的自动转换在application.yml中添加mybatis:configuration:map-underscore-to-camel-case:true隐藏密码在user实体类中password上方加上 JsonIgnore获取GetMapping(/userInfo)publicResultUseruserInfo(RequestHeader(nameAuthorization)Stringtoken){MapString,ObjectmapJwtUtil.parseToken(token);Stringusername(String)map.get(username);UseruseruserService.findByUserName(username);returnResult.success(user);}在postman 中Pre-request配置pm.request.addHeader(Authorization:令牌);可以全局配置令牌。实现效果ThreadLocal提供线程局部变量- 优化userinfo代码用来存取数据set()/get()使用ThreadLocal存储的数据线程安全用完记得在拦截器调用remove方法施放(防止内存泄漏)OverridepublicvoidafterCompletion(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,NullableExceptionex)throwsException{//清空ThreadLocal中的数据ThreadLocalUtil.remove();}更新用户基本信息参数校验在实体类成员的成员变量上添加注解记得要在UserController中接口方法的实体参数上添加 Validated注意NotNull 表示不能不传NotEmpty 表示不能不传 也不能是空字符串内容不为空更新用户头像patch更新部分数据信息put完整替换资源需要发送完整的资源对象patch用于更新部分资源只需发送变更字段更新用户密码文章分类写代码流程controller -跳转 Service接口 -跳转 Serviceimpl类实现接口方法 -跳转 mapper实现方法新增文章分类文章分类列表在Category.java 中添加createTime:2026-07-22T16:46:22,updateTime:2026-07-22T16:46:22JsonFormat(patternyyyy-MM-dd HH:mm:ss)privateLocalDateTimecreateTime;//创建时间JsonFormat(patternyyyy-MM-dd HH:mm:ss)privateLocalDateTimeupdateTime;//更新时间-createTime:2026-07-22 16:46:22,updateTime:2026-07-22 16:46:22更新文章分类分组校验groups解决添加方法无需id 但update方法需要 id而添加NotNull注解导致出错如果某个校验项没有指定分组默认属于Default分组可以继承defaultpackagecom.yanxi.pojo;importcom.fasterxml.jackson.annotation.JsonFormat;importjakarta.validation.constraints.NotEmpty;importjakarta.validation.constraints.NotNull;importjakarta.validation.groups.Default;importlombok.Data;importjava.time.LocalDateTime;DatapublicclassCategory{NotNull(groupsUpdate.class)privateIntegerid;//主键IDNotEmpty//(groups {Add.class,Update.class}) 分组继承Default可优化privateStringcategoryName;//分类名称NotEmptyprivateStringcategoryAlias;//分类别名privateIntegercreateUser;//创建人IDJsonFormat(patternyyyy-MM-dd HH:mm:ss)privateLocalDateTimecreateTime;//创建时间JsonFormat(patternyyyy-MM-dd HH:mm:ss)privateLocalDateTimeupdateTime;//更新时间publicinterfaceAddextendsDefault{}publicinterfaceUpdateextendsDefault{}}PostMappingpublicResultadd(RequestBodyValidated(Category.Add.class)Categorycategory){categoryService.add(category);returnResult.success();}文章管理快捷键Ctrl Shift t 包围代码(如用try-catch)Ctrl Shift / /**/ 包围注释