网站开发主页,打开网站需要用户名密码,wordpress首页图片不显示,成品网站免费模板黑马课程 文章目录1. SpringBoot入门1.1 SpringBoot入门案例步骤1#xff1a;创建SpringBoot项目高版本springboot常见错误步骤2#xff1a;创建BookController步骤3#xff1a;启动服务器并运行程序pom.xml示例1.2 官网创建SpringBoot1.3 SpringBoot工程快速启动问题导入打… 黑马课程 文章目录1. SpringBoot入门1.1 SpringBoot入门案例步骤1创建SpringBoot项目高版本springboot常见错误步骤2创建BookController步骤3启动服务器并运行程序pom.xml示例1.2 官网创建SpringBoot1.3 SpringBoot工程快速启动问题导入打包启动1.4 SpringBoot概述起步依赖spring-boot-starter-parentspring-boot-starter-webspring-boot-starter-test引导类和自动配置切换web服务器辅助功能2. SpringBoot配置文件2.1 配置文件格式2.2 yaml格式2.3 yaml配置文件数据读取方法一Value方法二Environment方法三实体类常用3. 多环境配置3.1 yml配置3.2 properties配置3.3 命令行配置3.4 配置方式的优先级3.5 多环境开发兼容问题3.6 配置文件分类4. SpringBoot整合4.1 SpringBoot整合JunitSpring整合JunitSpringBoot整合Junit4.2 SpringBoot整合MyBatisSpring整合MyBatisSpringBoot整合MyBatis步骤1创建项目和导入依赖步骤2准备数据库表并创建实体类步骤3编写dao文件步骤4编写配置文件application.yml步骤5测试报错解决serverTimezoneUTC5. 案例SpringBoot整合SSM5.1 搭建项目创建springboot项目application.yml5.2 功能模块domaindaoserviceexceptioncontrollerCodeResultProjectExceptionAdviceBookController5.3 单元测试5.4 静态资源1. SpringBoot入门
SpringBoot 是由 Pivotal 团队提供的全新框架其设计目的是用来简化 Spring 应用的初始搭建以及开发过程 回顾SpringMVC项目和SpringBoot进行比较 1.1 SpringBoot入门案例
步骤1创建SpringBoot项目 创建之前先设置好自己的maven本地仓库 注意这里Spring Boot的版本3版本容易出现冲突如果选择2版本暂时未发现报错 创建好的结构如下
src, test, pom.xml这三个是必须有的
高版本springboot常见错误 之前选择了3.0.2版本的springboot由于JDK版本较低是 JDK8 版本所以会出现配置不统一而报错 即创建时选择了JDK8而 SpringBoot3 最低要求是 JDK17 从而导致项目配置是JDK8但Spring环境是JDK17出现冲突 这种情况的解决思路 1.升级JDK 2.对Spring降级下面的方法降到JDK8实际上就和创建时选择版本2的SpringBoot一致了只是用于修改已有项目 java: JDK isnt specified for module springboot 原因.idea中存放了一些项目的配置信息如果删除将报错此错误 方案重启时会自动创建新的.idea报错时重新打开一次项目即可 java: 警告: 源发行版 17 需要目标发行版 17 则检查以下三个地方的JDK版本是否正确如这里是1.8版本 Project Structure – Project – SDK 选择 1.8 Project Structure – Modules – Language Level 选择 8 Settings – Build,Execution,Deployment – Compiler – Project bytecode version 选择 8 以及同位置的Target bytecode version 输入8  类文件具有错误的版本 61.0, 应为 52.0 原因之前创建时选择了3.0.2版本的springboot版本过高 解决修改pom.xml里面的相关配置如下 parentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion2.7.8/versionrelativePath/ !-- lookup parent from repository --
/parent
propertiesjava.version1.8/java.version
/properties步骤2创建BookController
package com.example.controller;RestController
RequestMapping(/books)
public class BookController {GetMapping(/{id})public String getById(PathVariable Integer id){System.out.println(id id);return hello, spring boot;}
}步骤3启动服务器并运行程序
直接运行创建项目时自动生成的SpringbootApplication程序即可启动tomcat服务器 访问http://localhost:8080/books/1成功看到结果
不用再书写之前一大堆的配置类springboot自动配置不用手动导入依赖Spring相关依赖已经在pom.xml自动创建 spring-boot-starter-web和spring-boot-starter-test分别涵盖了spring web相关依赖和test相关依赖
pom.xml示例
?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionparent!-- 和之前的maven继承学习的继承父工程的依赖 --groupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion2.7.8/versionrelativePath/ !-- lookup parent from repository --/parentgroupIdcom.example/groupIdartifactIdspringboot/artifactIdversion0.0.1-SNAPSHOT/versionpropertiesjava.version1.8/java.version/propertiesdependencies!-- 注意这里都没有写版本号 --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependency/dependenciesbuildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactId/plugin/plugins/build
/project1.2 官网创建SpringBoot 在1.1节通过IDEA创建了SpringBoot项目如果不使用IDEA可以通过官网教程创建 进入SpringBoot官网https://spring.io/projects/spring-boot
对项目进行配置 会下载一个springboot项目的zip文件
1.3 SpringBoot工程快速启动
问题导入 问题导入 前端开发人员需要测试前端程序就需要后端开启服务器这需要前端人员在自己电脑上安装Tomcat和Idea 解决方法 后端将 SpringBoot 工程打成 jar 包该 jar包运行不依赖于Tomcat和 Idea 这些工具只需要连接到相同的 Mysql 数据库即可
打包
构建 SpringBoot 工程时自动在 pom.xml 中配置了如下插件
plugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactId
/plugin此时只需要package命令即可在target目录下生成对应的jar包 启动
进入jar包所在位置在cmd命令行中输入
java -jar springboot-0.0.1-SNAPSHOT.jar可以看到和在IDEA一样的执行结果 之前的maven项目也可以打成jar包但不能像这样通过java -jar命令直接启动 依赖于 spring-boot-maven-plugin 插件 1.4 SpringBoot概述
SpringBoot程序的优点针对的是Spring的缺点
自动配置。这个是用来解决Spring程序配置繁琐的问题起步依赖。这个是用来解决Spring程序依赖设置繁琐的问题辅助功能内置服务器,…。在启动SpringBoot程序时既没有使用本地的tomca也没有使用tomcat插件而是使用SpringBoot内置的服务器
起步依赖
在pom.xml中配置相当于之前Spring里面的各种依赖导入
使用 Spring Initializr 方式创建的 Maven 工程的的 pom.xml 配置文件中自动生成了很多包含 starter 的依赖
parentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion2.7.8/versionrelativePath/ !-- lookup parent from repository --
/parent
dependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependency
/dependencies
spring-boot-starter-parent
查看该jar包发现它又继承自spring-boot-dependencies
parentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-dependencies/artifactIdversion2.7.8/version
/parentspring-boot-starter-parent主要是配置了插件管理pluginManagement 它的父工程spring-boot-dependencies才是配置了各种依赖及其版本
spring-boot-dependencies里面主要有propertiesdependencyManagementbuild 3个配置 properties 定义了各个技术软件依赖的版本避免了考虑版本的兼容问题 这里的版本是和SpringBoot的版本相对应的比如这里的SpringBoot对应的是2.7.8版本那么几个之前用过的依赖版本如下 servlet-api.version4.0.1/servlet-api.version
mysql.version8.0.32/mysql.versiondependencyManagement 相当于对所依赖jar包进行版本管理的管理器它并没有导入依赖只是锁定了版本 子工程如果需要某个依赖只需要引入依赖的 groupid 和 artifactId 不需要定义 version例如 dependencygroupIdcom.mysql/groupIdartifactIdmysql-connector-j/artifactIdversion${mysql.version}/versionexclusionsexclusiongroupIdcom.google.protobuf/groupIdartifactIdprotobuf-java/artifactId/exclusion/exclusions
/dependency里面还有一些版本号直接写明的依赖表示不建议更改版本如 dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactIdversion2.7.8/version
/dependencybuild 里面主要是buildManagement对各种插件进行了版本锁定 如果由于版本原因报错com.mysql:mysql-connector-j:jar:unknown was not found 等还是可以自己指定版本号来解决 spring-boot-starter-web
包含了如下的依赖
dependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter/artifactIdversion2.7.8/versionscopecompile/scope/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-json/artifactIdversion2.7.8/versionscopecompile/scope/dependency!-- 这个依赖使得项目内置了一个tomcat这也是之前java -jar能够运行的原因 --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-tomcat/artifactIdversion2.7.8/versionscopecompile/scope/dependency!-- SpringMVC相关jar包 --dependencygroupIdorg.springframework/groupIdartifactIdspring-web/artifactIdversion5.3.25/versionscopecompile/scope/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-webmvc/artifactIdversion5.3.25/versionscopecompile/scope/dependency
/dependenciesspring-boot-starter-test
里面主要是dependencies标签定义和测试相关的jar包例如之前用过的spring-test就在这里引入
dependencygroupIdorg.springframework/groupIdartifactIdspring-test/artifactIdversion5.3.25/versionscopecompile/scope
/dependency引导类和自动配置
引导类
SpringBoot项目在创建时会自动创建一个SpringbootApplication的引导类如下
package com.example;SpringBootApplication
public class SpringbootApplication {public static void main(String[] args) {SpringApplication.run(SpringbootApplication.class, args);}
}SpringBoot在创建项目时采用jar的打包方式SpringBoot的引导类是项目的入口运行main方法就可以启动项目pom.xml中配置了 spring-boot-starter-web 依赖该依赖中又包含tomcat依赖因此运行引导类可以启动工程
自动配置
SpringBootApplication注解会将引导类所在的包及其子包都扫描一遍
切换web服务器辅助功能
之前用的都是tomcat服务器如果需要换成jetty服务器nexus私服就是用的jetty服务器可以按如下设置
步骤1排除掉tomcat服务器
在项目的pom.xml文件中找到spring-boot-starter-web并设置排除掉tomcat
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactIdexclusionsexclusiongroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-tomcat/artifactId/exclusion/exclusions
/dependency此时再运行引导类发现启动后很快停止因为未能启动tomcat服务器
步骤2引入jetty服务器
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-jetty/artifactId
/dependency此时再启动就可以看到jetty服务器被启动了 jetty比tomcat更轻量级扩展性更好谷歌应用引擎GAE已经全面切换为jetty 大型应用仍使用tomcat 2. SpringBoot配置文件
2.1 配置文件格式
springboot项目创建后在resources下会创建一个空的application.properties配置文件修改端口号等都在此文件中配置 也可以将application.properties换成application.yml、application.yaml application.properties server.port80application.yml 必须有空格 server:port: 81application.yaml 必须有空格 server:port: 82注意SpringBoot 程序的配置文件名必须是 application 只是后缀名不同而已 一般写yml配置文件三个配置文件的先后优先级是properties、yml、yaml
如果配置文件有问题可以在如下地方进行SpringBoot的配置文件设置 2.2 yaml格式
YAMLYAML Ain’t Markup Language一种数据序列化格式
优点 容易阅读 yaml 类型的配置文件比 xml 类型的配置文件更容易阅读结构更加清晰 容易与脚本语言交互 以数据为核心重数据轻格式 yaml 更注重数据而 xml 更注重格式
YAML 文件扩展名
.yml (主流).yaml
语法规则 大小写敏感 属性层级关系使用多行描述每行结尾使用冒号结束 使用缩进表示层级关系同层级左侧对齐只允许使用空格不允许使用Tab键 属性值前面添加空格属性名与属性值之间使用冒号空格作为分隔 # 表示注释 数组数据在数据书写位置的下方使用减号作为数据开始符号每行书写一个数据减号与数据间空格分隔例如 subject:- Java- 前端- 大数据2.3 yaml配置文件数据读取
编写application.yml文件
lesson: SpringBootserver:port: 80enterprise:name: companyage: 16tel: 123456789subject:- java- c- python方法一Value
在BookController中获取application.yml方式
Value(${lesson})
private String lesson;
Value(${server.port})
private Integer port;
Value(${enterprise.subject[0]})
private String subject00;方法二Environment
package com.example.controller;RestController
RequestMapping(/books)
public class BookController {Autowiredprivate Environment environment;GetMapping(/{id})public String getById(PathVariable Integer id){System.out.println(environment.getProperty(enterprise.age));return hello, spring boot;}
} 在框架中常使用一般开发很少用 方法三实体类常用
package com.example.domain;Component
ConfigurationProperties(prefix enterprise)
public class Enterprise {private String name;private int age;private String tel;private String[] subject;//省略getter, setter, toString
}package com.example.controller;RestController
RequestMapping(/books)
public class BookController {Autowiredprivate Enterprise enterprise;GetMapping(/{id})public String getById(PathVariable Integer id){System.out.println(enterprise);return hello, spring boot;}
}3. 多环境配置 回顾之前在学习Maven时多环境是通过在父工程中配置 profiles实现的 3.1 yml配置
在 application.yml 中使用 --- 来分割不同的配置设置多环境
# 设置启动的环境
spring:profiles:active: dev---
#开发
spring:profiles: dev
server:port: 80---
#生产
spring:profiles: pro
server:port: 81---
#测试
spring:profiles: test
server:port: 82这种写法会提示过时新的写法为
# 设置启动的环境
spring:profiles:active: dev---
#开发
spring:config:activate:on-profile: dev
server:port: 80可以自己选择哪种写法
3.2 properties配置
创建application.properties如下
#设置启动的环境
spring.profiles.activedev创建application-dev.properties如下
server.port8080同样还需要创建 application-pro.propertiesapplication-test.properties即可完成多环境配置
3.3 命令行配置
步骤1打包 package前先clean一下 如果有中文打包可能报错修改项目编码 打包方式maven项目里面的Lifecycle
步骤2指定环境运行项目
java -jar springboot-0.0.1-SNAPSHOT.jar --server.port88 --spring.profiles.activetest在jar包所在目录下target下打开cmd输入如上命令 如果在命令行指定了port它的优先级高于配置文件中的设置
3.4 配置方式的优先级
见springboot官网
https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-external-config3.5 多环境开发兼容问题 这部分很少用了解即可 maven中可以配置多环境pom.xmlspringboot也可以配置多环境application.yml如果都配置了谁的优先级更高
pom.xml的优先级高于application.yml
现在有这样一个需求 要求springboot和maven的环境统一 希望springboot能读取maven里的多环境设置使得springboot里面的环境设置跟随maven 实现在pom.xml指定默认环境但不指定端口号这个默认环境要被maven和springboot通用 application.yml会设置具体的、不同环境下的端口号但默认环境将跟随pom.xml里面的设置
步骤1Maven中设置多环境属性pom.xml
profiles!-- 开发环境 --profileiddev/idpropertiesprofile.activedev/profile.active/properties!-- 默认环境--activationactiveByDefaulttrue/activeByDefault/activation/profile!-- 生产环境 --profileidpro/idpropertiesprofile.propro/profile.pro/properties/profile!-- 测试环境 --profileidtest/idpropertiesprofile.protest/profile.pro/properties/profile
/profiles步骤2在springboot中也设置多环境application.yml
# 设置启动的环境
spring:profiles:active: ${profile.active}
---
#开发
spring:profiles: dev
server:port: 80
---
#生产
spring:profiles: pro
server:port: 81
---
#测试
spring:profiles: test
server:port: 82步骤3开启插件pom.xml
允许占位符解析
pluginartifactIdmaven-resources-plugin/artifactIdconfigurationencodingutf-8/encodinguseDefaultDelimiterstrue/useDefaultDelimiters/configuration
/plugin步骤4打包 此时打包之后application.yml里面的active: ${profiles.active}就变为active: dev了 路径springboot\target\springboot-0.0.1-SNAPSHOT.jar\BOOT-INF\classes\application.yml
3.6 配置文件分类 jar包内部的配置文件 resouces/application.yml 和 resources/config/application.yml 后者的优先级高于前者 resouces/application.yml 相当于不稳定版本时常向里面修改 resources/config/application.yml 相当于发布版本 jar包外部的配置文件 问题临时配置如果太多在命令行测试jar包时就不得不加上一堆属性 解决方法在路径下添加临时配置文件它的优先级项目里的配置文件 且同样的config里面的配置文件优先级高于外面的配置文件 运行程序发现在target/config/目录下的application.yml具有最高优先级 java -jar springboot-0.0.1-SNAPSHOT.jar如下载各种软件如tomcat里面会携带各种类似的配置文件
4. SpringBoot整合
4.1 SpringBoot整合Junit
Spring整合Junit
RunWith(SpringJUnit4ClassRunner.class)//设置运行器
ContextConfiguration(classes SpringConfig.class)//加载环境
public class UserServiceTest {Autowiredprivate BookService bookService;//注入测试对象Testpublic void testSave(){//测试功能bookService.save();}
}SpringBoot整合Junit
生成SpringBoot项目时在test里面会自动生成一个SpringbootApplicationTests类只需要在contextLoads里面调用方法即可测试
package com.example;SpringBootTest
class SpringbootApplicationTests {Autowiredprivate BookService bookService;Testvoid contextLoads() {bookService.save();}
}在引导类com.example.SpringbootApplicationTests上有注解SpringBootTest 它会自动扫描引导类所在的包及子包org.example因此被Service标注的BookServiceImpl会成为Bean实现自动注入 测试类会自动加载引导类即初始化Spring的环境 测试类必须在引导类的包或子包中这里是com.example 如果测试类位置不对可以通过如下命令为其指定启动类的位置 SpringBootTest(classes SpringbootApplication.class)4.2 SpringBoot整合MyBatis
Spring整合MyBatis
编写配置类 SpringConfig配置Spring扫描bean引入JdbcConfigMybatisConfigJdbcConfig设置数据库连接参数和数据源MybatisConfig获取SqlSessionFactory对象定义映射配置扫描dao包
SpringBoot整合MyBatis
步骤1创建项目和导入依赖
在创建选择依赖时勾选以下三项Web/Spring WebSQL/MyBatis FrameworkMySQL Driver 也可以为已经现有项目直接添加依赖来完成整合 添加的依赖版本仍需要和原项目的springboot版本相吻合 新增了依赖
!-- 整合mybatis相关 --
dependencygroupIdorg.mybatis.spring.boot/groupIdartifactIdmybatis-spring-boot-starter/artifactIdversion2.3.0/version
/dependency
dependencygroupIdcom.mysql/groupIdartifactIdmysql-connector-j/artifactIdscoperuntime/scope
/dependency
dependencygroupIdcom.alibaba/groupIdartifactIddruid/artifactIdversion1.1.16/version
/dependency注意创建项目不会自动添加 druid 依赖需要手动添加一下
这里要根据springboot版本有的版本用的是如下mysql依赖
dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdscoperuntime/scope
/dependency步骤2准备数据库表并创建实体类
package com.example.domain;public class Book {private Integer id;private String name;private String type;private String description;//省略getter, setter, toString
}步骤3编写dao文件
package com.example.dao;Mapper
public interface BookDao {Select(select * from tbl_book where id #{id})public Book getById(Integer id);
}注意这里要添加Mapper注解而不是Repository
步骤4编写配置文件application.yml
spring:datasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/ssm_db?useSSLfalseusername: rootpassword: 123456#下面配置数据源使用druidtype: com.alibaba.druid.pool.DruidDataSource如果SpringBoot版本是2.7.8可能提示你的jdbc驱动过时了让更换为com.mysql.cj.jdbc.Driver改不改都行
步骤5测试
package com.example;SpringBootTest
class SpringbootApplicationTests {Autowiredprivate BookDao bookDao;Testvoid contextLoads() {Book book bookDao.getById(1);System.out.println(book);}
}运行即可获得数据库内容
springboot节省了大量的配置编写
报错解决serverTimezoneUTC
SpringBoot版本低于2.4.3(不含)Mysql驱动版本大于8.0时需要在url连接串中配置时区 jdbc:mysql://localhost:3306/ssm_db?useSSLfalseserverTimezoneUTC 或在MySQL数据库端配置时区解决此问题
在pom.xml将springboot的version改为2.4.2即可看到这个相关报错
5. 案例SpringBoot整合SSM
需求将之前的ssm项目springmvc-ssm转为springboot项目
5.1 搭建项目
创建springboot项目
dependencies!-- mybatis相关 --dependencygroupIdorg.mybatis.spring.boot/groupIdartifactIdmybatis-spring-boot-starter/artifactIdversion2.3.0/version/dependencydependencygroupIdcom.mysql/groupIdartifactIdmysql-connector-j/artifactIdscoperuntime/scope/dependencydependencygroupIdcom.alibaba/groupIdartifactIddruid/artifactIdversion1.1.16/version/dependency!-- web相关 --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency!-- 测试类相关 --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependency
/dependenciesapplication.yml
#TODO 配置数据源相关信息server:port: 80spring:datasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/ssm_db?useSSLfalseserverTimeZoneUTCusername: rootpassword: 123456type: com.alibaba.druid.pool.DruidDataSource5.2 功能模块
domain
package com.example.domain;public class Book {private Integer id;private String name;private String type;private String description;//省略了setter, getter, toString
}dao
package com.example.dao;//TODO 添加Mapper
Mapper
public interface BookDao {Insert(insert into tbl_book values (null, #{type}, #{name}, #{description}))public int save(Book book);Delete(delete from tbl_book where id #{id})public int delete(Integer id);Update(update tbl_book set type #{type}, name #{name}, description #{description} where id #{id})public int update(Book book);Select(select * from tbl_book where id #{id})public Book getById(Integer id);Select(select * from tbl_book)public ListBook getAll();
}service
package com.example.service;Transactional
public interface BookService {public boolean save(Book book);public boolean delete(Integer id);public boolean update(Book book);public Book getById(Integer id);public ListBook getAll();
}package com.example.service.impl;Service
public class BookServiceImpl implements BookService {Autowiredprivate BookDao bookDao;Overridepublic boolean save(Book book) {System.out.println(book);return bookDao.save(book) 0;}Overridepublic boolean delete(Integer id) {return bookDao.delete(id) 0;}Overridepublic boolean update(Book book) {return bookDao.update(book) 0;}Overridepublic Book getById(Integer id) {if(id 1){//模拟异常抛出自定义的业务异常类throw new BussinessException(Code.BUSINESS_ERROR, 查询失败请重试);}return bookDao.getById(id);}Overridepublic ListBook getAll() {return bookDao.getAll();}
}exception
统一异常处理
BussinessException
package com.example.exception;public class BussinessException extends RuntimeException{private Integer code;//构造器public BussinessException(Integer code, String message){super(message);this.code code;}public BussinessException(Integer code, String message, Throwable cause){super(message, cause);this.code code;}//getter, setter
}SystemException
package com.example.exception;public class SystemException extends RuntimeException{private Integer code;//构造器public SystemException(Integer code, String message){super(message);this.code code;}public SystemException(Integer code, String message, Throwable cause){super(message, cause);this.code code;}//getter, setter
}controller
Code
package com.example.controller;public class Code {//操作成功public static final Integer SAVE_OK 20011;public static final Integer DELETE_OK 20021;public static final Integer UPDATE_OK 20031;public static final Integer GET_OK 20041;//操作失败public static final Integer SAVE_ERR 20010;public static final Integer DELETE_ERR 20020;public static final Integer UPDATE_ERR 20030;public static final Integer GET_ERR 20040;//定义异常类型public static final Integer SYSTEM_ERR 50001;public static final Integer BUSINESS_ERROR 50002;public static final Integer SYSTEM_UNKNOWN_ERR 59999;
}Result
统一前后端发送数据格式
package com.example.controller;public class Result {private Integer code;private Object data;private String msg;//构造器public Result(){}public Result(Integer code, Object data){this.code code;this.data data;}public Result(Integer code, Object data, String msg){this.code code;this.data data;this.msg msg;}//getter, setter, toString
}ProjectExceptionAdvice
异常处理器
package com.example.controller;RestControllerAdvice
public class ProjectExceptionAdvice {//1. 拦截系统异常ExceptionHandler(SystemException.class)public Result doSystemException(SystemException ex){//记录日志//发送消息给运维//发送消息给开发人员return new Result(ex.getCode(), null, ex.getMessage());}//2. 拦截业务异常ExceptionHandler(BussinessException.class)public Result doBussinessException(SystemException ex){return new Result(ex.getCode(), null, ex.getMessage());}//3. 拦截其他异常ExceptionHandler(Exception.class)public Result doException(Exception ex){//记录日志//发送消息给运维//发送消息给开发人员return new Result(Code.SYSTEM_UNKNOWN_ERR, null, 系统繁忙请稍后重试);}
}BookController
package com.example.controller;RestController
RequestMapping(/books)
public class BookController {Autowiredprivate BookService bookService;PostMappingpublic Result save(RequestBody Book book){boolean flag bookService.save(book);return new Result(flag?Code.SAVE_OK:Code.SAVE_ERR, flag);}DeleteMapping(/{id})public Result delete(PathVariable Integer id){boolean flag bookService.delete(id);return new Result(flag?Code.DELETE_OK:Code.DELETE_ERR, flag);}PutMappingpublic Result update(RequestBody Book book){boolean flag bookService.update(book);return new Result(flag?Code.UPDATE_OK:Code.UPDATE_ERR, flag);}GetMapping(/{id})public Result getById(PathVariable Integer id){Book book bookService.getById(id);Integer code book ! null ? Code.GET_OK : Code.GET_ERR;String msg book ! null ? 查询成功 : 数据查询失败请重试;return new Result(code, book, msg);}GetMappingpublic Result getAll(){ListBook bookList bookService.getAll();Integer code bookList ! null ? Code.GET_OK : Code.GET_ERR;String msg bookList ! null ? 查询成功 : 数据查询失败请重试;return new Result(code, bookList, msg);}
}5.3 单元测试
package com.example;SpringBootTest
class SpringbootApplicationTests {Autowiredprivate BookService bookService;Testpublic void testGetById(){Book book bookService.getById(2);System.out.println(book);}Testpublic void testGetAll(){ListBook bookList bookService.getAll();System.out.println(bookList);}
}可以使用postman进行测试 5.4 静态资源
将之前的做好的前端项目拷贝到 resource/static 目录下 启动引导类浏览器访问页面http://localhost/pages/books.html 在前端可以设置一个index.html页面如下
scriptdocument.location.href pages/books.html
/script然后访问http://localhost即可达到主页