JavaCloud《学成在线》 学习笔记2

加把劲骑士的学习笔记

前置已经学完了 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>

课程查询

  1. 生成po类()

PO即持久对象(Persistent Object),它们是由一组属性和属性的get和set方法组成,PO对应于数据库的表。

在开发持久层代码时需要根据数据表编写PO类,在实际开发中通常使用代码生成器(工具)生成PO类的代码。

  1. 找到文件中的

修改 账号 密码 和生成的表

生成即可。

方案二:也可以使用 Mybatis插件

配置数据库链接

选择生成的表

ps个人不建议这种  侵入性太强了  万一搞错了还得去拉之前的代码

接口定义

  1. 在项目基础工程下定义页码页数的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;
}
  1. 在内容工程下定义查询课程的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 无法实例化该类。

经过检查发现(注解写错了 悲)

  1. 时间的序列化和反序列化

可以直接在时间属性上加上

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")

面试

    1. 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

 

    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值