加把劲骑士的学习笔记
前置已经学完了 JavaWeb 和 SpringColud的相关课程,目前做过了苍穹外卖项目,想做一个微服务架构的项目,此贴将记录下学习JavaCloud遇过的坑和解决步骤,欢迎大家讨论。
(因为找不到实习 被迫写博客解闷和幻想中100万的计算机研究生悲)
内容管理模块
工程结构
在微服务框架中 不在使用springboot中三段式开发,按照接口要求分成
三个微服务部分。与黑马商城不同的是 黑马商城是按照业务块之间做拆分的,这个是按照功能做拆分的.
xuecheng-plus-content只聚合项目
创建流程:
点击新建模块
填写信息
JDK和jave都可以暂时写17 等创建完再改
点击下一步
点击创建
点击项目结构
语言和依赖改为8
模块聚合
xuecheng-plus-content 这个模块继承 父工程在pom文件中修改成以下代码
<parent>
<groupId>com.xuecheng</groupId>
<artifactId>xuecheng-plus-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../xuecheng-plus-parent</relativePath> <!-- lookup parent from repository -->
</parent>
然后聚合 api service mode模块
<modules>
<module>xuecheng-plus-content-api</module>
<module>xuecheng-plus-content-service</module>
<module>xuecheng-plus-content-model</module>
</modules>
课程查询
- 生成po类()
PO即持久对象(Persistent Object),它们是由一组属性和属性的get和set方法组成,PO对应于数据库的表。
在开发持久层代码时需要根据数据表编写PO类,在实际开发中通常使用代码生成器(工具)生成PO类的代码。
- 找到文件中的
修改 账号 密码 和生成的表
生成即可。
方案二:也可以使用 Mybatis插件
配置数据库链接
选择生成的表
(ps:个人不建议这种 侵入性太强了 万一搞错了还得去拉之前的代码 )
接口定义
- 在项目基础工程下定义页码页数的DTO与数据返回的类型
@Data
@AllArgsConstructor
@NoArgsConstructor
public class PageParams {
//当前页码
private Long pageNo = 1L;
//每页显示的记录数
private Long pageSize = 30L;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public class PageResult<T> implements Serializable {
// 数据列表
private List<T> items;
//总记录数
private long counts;
//当前页码
private long page;
//每页记录数
private long pageSize;
}
- 在内容工程下定义查询课程的DTO
@Data
@AllArgsConstructor
@Negative
public class QueryCourseParamsDto {
//审核状态
private String auditStatus;
//课程名称
private String courseName;
//发布状态
private String publishStatus;
}
在api内写分页查询的Controller接口
配置api的启动类
写配置信息模块
在经历完以上步骤后 发现 idea没办法扫描到服务 检查后发现是pom文件里没写<build>配置部分
在pom文件中补充
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
接口接收两部分参数,一部分是分页参数,它是通过http url传递key/value串,另一部分是业务查询条件,通过http body传入json内容。
服务端使用RequestBody接收json内容,我们在测试并没有传递json内容这里导致错误。
在源码中 RequestBody默认为true
下边在@RequestBody后添加(required=false)表示此参数不是必填项,如下:
public PageResult<CourseBase> list(PageParams pageParams, @RequestBody(required=false) QueryCourseParamsDto queryCourseParams){
return null;
}
进行断点测试后 发现参数成功接收
http://localhost:63040/content/course/list?PageNo=1&oageSize=30
模型类的作用
1.DTO(数据传输对象)
核心用途:DTO 主要用于系统之间或者模块之间的数据传输,其核心目的是降低传输过程中的数据冗余。
关键特性:
它仅仅包含数据字段以及对应的 getter/setter 方法,不涉及任何业务逻辑。
可以对多个实体的数据进行组合,以满足不同的传输需求。
一般在远程调用、API 接口返回等场景中使用。
应用场景:当需要将用户信息从服务端传输到客户端时,DTO 可能会包含用户 ID、用户名、邮箱等字段。
2.VO(视图对象)
核心用途:VO 专门为前端展示数据而设计,其目的是优化前端的展示体验。
关键特性:
通常是 DTO 的子集或者经过转换后的数据结构。
可能会包含一些用于展示的计算字段,比如格式化后的日期、拼接后的地址等。
与前端界面的展示需求紧密相关。
应用场景:在电商商品列表页面,VO 除了包含商品的基本信息外,还可能包含折扣率、评分等计算后的展示数据。
3.PO(持久化对象)
核心用途:PO 主要用于和数据库表进行映射,是数据持久化的载体。
关键特性:
每个 PO 对象通常对应数据库中的一张表,字段和表结构一一对应。
可能会包含一些简单的持久化操作,如保存、更新等。
一般不建议直接将 PO 暴露给外部,而是通过转换为 DTO 进行数据传输。
应用场景:在关系型数据库中,一个用户表可能对应一个 UserPO 类,包含用户的所有字段。
生成接口文档
什么是Swagger?
OpenAPI规范(OpenAPI Specification 简称OAS)是Linux基金会的一个项目,试图通过定义一种用来描述API格式或API定义的语言,来规范RESTful服务开发过程,目前版本是V3.0,并且已经发布并开源在github上。
(GitHub - OAI/OpenAPI-Specification: The OpenAPI Specification Repository)
Swagger是全球最大的OpenAPI规范(OAS)API开发工具框架,Swagger是一个在线接口文档的生成工具,前后端开发人员依据接口文档进行开发。 (API Documentation & Design Tools for Teams | Swagger)
Spring Boot 可以集成Swagger,Swaager根据Controller类中的注解生成接口文档 ,只要添加Swagger的依赖和配置信息即可使用它。
1、在API工程添加swagger-spring-boot-starter依赖
<!-- Spring Boot 集成 swagger -->
<dependency>
<groupId>com.spring4all</groupId>
<artifactId>swagger-spring-boot-starter</artifactId>
</dependency>
在 bootstrap.yml中配置swagger的扫描包路径及其它信息,base-package为扫描的包路径,扫描Controller类。
2、在配置项中添加
swagger:
title: "学成在线内容管理系统"
description: "内容系统管理系统对课程相关信息进行管理"
base-package: com.xuecheng.content
enabled: true
version: 1.0.0
在启动类中添加@EnableSwagger2Doc注解
@Api(value = "课程信息编辑接口",tags = "课程信息编辑接口")
@RestController
public class CourseBaseInfoController {
@ApiOperation("课程查询接口")
@PostMapping("/course/list")
public PageResult<CourseBase> list(PageParams pageParams, @RequestBody(required=false) QueryCourseParamsDto queryCourseParams){
}
}
Swaager的常用注解如下:
@Api:修饰整个类,描述Controller的作用
@ApiOperation:描述一个类的一个方法,或者说一个接口
@ApiParam:单个参数描述
@ApiModel:用对象来接收参数
@ApiModelProperty:用对象接收参数时,描述对象的一个字段
@ApiResponse:HTTP响应其中1个描述
@ApiResponses:HTTP响应整体描述
@ApiIgnore:使用该注解忽略这个API
@ApiError :发生错误返回的信息
@ApiImplicitParam:一个请求参数
@ApiImplicitParams:多个请求参数
在测试的时候报了一个错
Cannot construct instance of `com.xuecheng.content.model.dto.QueryCourseParamsDto` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
at [Source: (PushbackInputStream); line: 2, column: 3]
@RequestBody 表示 Spring MVC 会尝试将 HTTP 请求体反序列化为 QueryCourseParamsDto 对象。
Jackson 在反序列化时需要一个 无参构造函数(default constructor) 或其他方式构造对象(如 Builder、工厂方法等)。
当前的 QueryCourseParamsDto 类 没有默认构造函数,导致 Jackson 无法实例化该类。
经过检查发现(注解写错了 悲)
- 时间的序列化和反序列化
可以直接在时间属性上加上
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
面试
-
- SpringBoot接口开发的常用注解有哪些?
@Controller标记此类是一个控制器,可以返回视图解析器指定的html页面,通过@ResponseBody可以将结果返回json、 xml数据。
@RestController相当于@ResponseBody加@Controller,实现rest接口开发,返回json数据,不能返回html页面。
@RequestMapping定义接口地址,可以标记在类上也可以标记在方法上,支持http的post、put、get等方法。
@PostMapping定义post接口,只能标记在方法上,用于添加记录,复杂条件的查询接口。
@GetMapping 定义get接口,只能标记在方法上,用于查询接口的定义。
@PutMapping定义put接口,只能标记在方法上,用于修改接口的定义。
@DeleteMapping定义delete接口,只能标记在方法上,用于删除接口的定义。
@RequestBody定义在方法上,用于将json串转成java对象。
@Pathvarible接收请求路径中占位符的值.
@ApiOperation swagger注解,对接口方法进行说明。
@Api swagger注解,对接口类进行说明。
@Autowired基于类型注入。
@Resourc基于名称注入,如果基于名称注入失败转为基于类型注入。
都看到这了 dora请你吃一个orange