文章目录
Springboot启动日志理解
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v3.2.4)
## 标志着Spring Boot应用正在初始化和启动。可以自定义Beaner,在src/main/resources中配置;
2024-04-01T16:52:29.367+08:00 INFO 23720 --- [xhjclass1] [ main] c.x.t.xhjclass1.Xhjclass1Application : Starting Xhjclass1Application using Java 17.0.10 with PID 23720 (D:\xhjwork\testwork\databaseTest1\xhjclass1\target\classes started by 13834 in D:\xhjwork\testwork\databaseTest1\xhjclass1)
## 应用程序启动类,使用Java版本为17.0.10,进程ID(PID)为23720 ,用户ID为13834的操作员
2024-04-01T16:52:29.378+08:00 INFO 23720 --- [xhjclass1] [ main] c.x.t.xhjclass1.Xhjclass1Application : No active profile set, falling back to 1 default profile: "default"
## 当Spring Boot应用启动时,它会查找激活的profile(配置文件集)。没有找到用于区分不同环境下的应用配置,比如开发环境、测试环境和生产环境等,则默认回退到default properties。
2024-04-01T16:52:30.279+08:00 INFO 23720 --- [xhjclass1] [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode.
## Spring Boot应用在启动时正在自动配置并初始化Spring Data JPA的相关组件
2024-04-01T16:52:30.297+08:00 INFO 23720 --- [xhjclass1] [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 6 ms. Found 0 JPA repository interfaces.
## 扫描6毫秒,发现0个JPA依赖接口;
2024-04-01T16:52:30.393+08:00 WARN 23720 --- [xhjclass1] [ main] o.m.s.mapper.ClassPathMapperScanner : No MyBatis mapper was found in '[com.xhj.test1.xhjclass1]' package. Please check your configuration.
## MyBatis没有找到任何映射器接口(Mapper)。映射器接口是用来定义SQL操作的方法以及与XML映射文件关联的Java接口,在MyBatis中它们扮演着数据访问层的核心角色。
2024-04-01T16:52:31.051+08:00 INFO 23720 --- [xhjclass1] [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port 8080 (http)
## 初始化tomcat 以及其8080端口
2024-04-01T16:52:31.061+08:00 INFO 23720 --- [xhjclass1] [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
## 启动tomcat
2024-04-01T16:52:31.061+08:00 INFO 23720 --- [xhjclass1] [ main] o.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/10.1.19]
## Spring Boot应用已开始启动嵌入式的Apache Tomcat 10.1.19版本作为Web容器,用于托管和运行你的Web应用程序。
2024-04-01T16:52:31.162+08:00 INFO 23720 --- [xhjclass1] [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2024-04-01T16:52:31.164+08:00 INFO 23720 --- [xhjclass1] [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1734 ms
## 初始化一个嵌入式的WebApplicationContext。
2024-04-01T16:52:31.432+08:00 INFO 23720 --- [xhjclass1] [ main] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default]
2024-04-01T16:52:31.564+08:00 INFO 23720 --- [xhjclass1] [ main] org.hibernate.Version : HHH000412: Hibernate ORM core version 6.4.4.Final
2024-04-01T16:52:31.591+08:00 INFO 23720 --- [xhjclass1] [ main] o.h.c.internal.RegionFactoryInitiator : HHH000026: Second-level cache disabled
## Hibernate ORM框架 处理日志
2024-04-01T16:52:31.835+08:00 INFO 23720 --- [xhjclass1] [ main] o.s.o.j.p.SpringPersistenceUnitInfo : No LoadTimeWeaver setup: ignoring JPA class transformer
## 当Spring找不到或无法设置LoadTimeWeaver时,会出现这条日志信息,意味着Spring不能启用JPA的类转换器(class transformer),即不会在类加载时对JPA实体类进行额外的处理。
2024-04-01T16:52:31.870+08:00 INFO 23720 --- [xhjclass1] [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
2024-04-01T16:52:33.047+08:00 INFO 23720 --- [xhjclass1] [ main] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Added connection org.sqlite.jdbc4.JDBC4Connection@8f2e3e6
2024-04-01T16:52:33.047+08:00 INFO 23720 --- [xhjclass1] [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
## HikariCP连接池,它是Spring Boot应用中常用的一种高性能的JDBC连接池实现。
2024-04-01T16:52:33.371+08:00 INFO 23720 --- [xhjclass1] [ main] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration)
## 这条日志信息来自Hibernate ORM框架,它表明当前环境中没有可用的Java Transaction API (JTA) 平台。
2024-04-01T16:52:33.380+08:00 INFO 23720 --- [xhjclass1] [ main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
## Spring Framework在启动过程中完成了对JPA(Java Persistence API)持久化单元(Persistence Unit)'default'的Entity Manager Factory的初始化。
2024-04-01T16:52:33.421+08:00 WARN 23720 --- [xhjclass1] [ main] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning
## Spring Boot默认开启了spring.jpa.open-in-view属性,这意味着在Spring MVC渲染视图(View Rendering)期间,仍会保持JPA的EntityManager处于打开状态,即实体管理器作用域跨越了HTTP请求的整个生命周期,包括视图渲染阶段。
## 可以通过spring.jpa.open-in-view=false 实现关闭
2024-04-01T16:52:34.206+08:00 INFO 23720 --- [xhjclass1] [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port 8080 (http) with context path ''
## Apache Tomcat服务器已经成功启动,并监听在8080端口上等待HTTP请求
2024-04-01T16:52:34.222+08:00 INFO 23720 --- [xhjclass1] [ main] c.x.t.xhjclass1.Xhjclass1Application : Started Xhjclass1Application in 5.343 seconds (process running for 5.879)
项目修改文件路径
修改项目文件夹的路径,即从:
main/java/com/demo/example/testxhj1/demo 改成:
main/java/com/demo
文件夹修改成功之后,需要对class类中的package以及import导包路径修改,之后就可以运行了。
以及再修改对应的mapper文件中涉及到类的定位等内容。
项目启动异常java.lang.AbstractMethodError
异常描述:
java.lang.AbstractMethodError: Receiver class org.springframework.boot.env.EnvironmentPostProcessorApplicationListener does not define or inherit an implementation of the resolved method 'abstract boolean supportsSourceType(java.lang.Class)' of interface org.springframework.context.event.SmartApplicationListener.
异常分析:
pom文件中,添加如下配置,但是会报上述错误。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.12.RELEASE</version>
</dependency>
原因分析:
springboot项目pom文件
<!-- 基本信息 -->
pom文件是maven构建工具使用的配置文件,用于定义项目的各种信息和依赖管理。
<groupId>com.unicom</groupId>
// 定义项目的组织唯一标识符,通常通过反域名的形式保证全球唯一性;
<artifactId>anon.sub</artifactId>
// 定义实际项目的名称与模块名称,与groupId构成项目的唯一坐标;
<version>1.0-SNAPSHOT</version>
// 指定项目的版本号
<packaging>jar</packaging>
// 指定项目打包后的类型
<name>anon.sub</name>
// 为项目提供一个人类可读的名称
<description>Anonymous Subscription</description>
// 为项目提供一个简短描述
日志文件
log-java配置文件:
@Around("(execution(* com.unicom.opn.xxx.*.*(..))))")
// 定义了切点表达式,表示该切面将拦截 com.unicom.opn.xxx 包下的所有控制器类的所有方法。
public Object aroundMethod(ProceedingJoinPoint pjp) throws Throwable {
// ProceedingJoinPoint 是一个特殊的接口,提供了继续目标方法执行的能力。
try {
ServiceTrace.BusinessTrace trace = ServiceTrace.BUSINESS_TRACE.get();
// 从线程局部变量中获取 BusinessTrace 实例。
ServiceId serviceId = null;
if(trace == null || trace.getCover()){
// 如果 trace 为空或者 trace.getCover() 为 true,则需要重新设置服务 ID。
serviceId = ((MethodSignature) pjp.getSignature()).getMethod().getAnnotation(ServiceId.class);
//绑定 服务描述;从当前方法签名中获取 ServiceId 注解
if(ObjectUtils.isNotEmpty(serviceId)){
ServiceTrace.bind(null,serviceId.value().name());
}else{
ServiceTrace.bind();
}
}else{
ServiceTrace.bind();
}
Object response = pjp.proceed();
// 调用目标方法并获取响应。
log.info(LogConstant.response_format, response);
// 记录响应信息到日志中。
return response;
} finally {
ServiceTrace.release();
// 清理线程局部变量,例如重置 BusinessTrace,确保下一次调用不会混淆信息。
}
}
项目配置文件
参考博客:
https://www.cnblogs.com/fanblogs/p/17236774.html
出现问题1:
不能实现maven切换后,实时更新配置,原因在于:需要重新加载一下maven。
spring:
autoconfigure:
exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
// 在Spring Boot应用中用来排除特定的自动配置类。具体来说,这里使用spring.autoconfigure.exclude属性来告诉Spring Boot不要自动配置com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure这个类。
application和bootstrap
application文件
定义:是 Spring Boot 项目中的主配置文件,用于配置应用程序的运行时属性;
内容:配置数据库连接、日志、缓存、端口等;
加载:单独出现,则最先加载;与bootstrap同时出现,则第二加载;
bootstrap文件
定义:是 Spring Cloud 项目中的配置文件,用于加载应用程序启动阶段的配置;
内容:Spring Cloud Config、Cacos、Consul、Eureka
加载:项目启动,优先于application加载;
项目打包过程
需求:
本地springboot项目打包;
部署到本地(windows系统)项目的docker中;
实现服务的启动与访问。
- 本地springboot项目打包:
项目工程右侧的maven,中运行package;
项目目录的target中,会出现 项目名-1.0-SNAPSHOT.jar 包;
部署到本地(windows)的docker中:
在项目目录下,创建DockerFile文件;
进入项目目录下,运行该命令;
docker build -f DockerFile -t anosub-springboot:1.0.0. .
其中DockerFile是项目目录下文件的名称;
末尾的点不能省略;
通过 -t 后面的英文指定images的名字和版本号;
docker run -p 8888:8888 --name docker-anosub-springboot anosub-springboot:1.0.0.
不清楚为什么在docker build中 最后要加一个点,不加点会报错;
这个点会跟在docker image的版本号里面;
dockerfile文件内容:
文件1:
FROM openjdk:8-jdk-alpine
// 指定了构建镜像的基础镜像是 官方OpenJDK 8的Java开发工具包(JDK)镜像创建;
EXPOSE 8888
// Docker该容器在运行时会监听8888端口
VOLUME /logs
// 创建一个匿名数据卷挂载点在/logs目录,用于持久化日志文件。这样做可以使得容器内外的日志文件可以共享,且当容器被删除时,日志数据不会丢失。
ARG JAR_FILE = target/my-docker-spring-boot-1.0.0-SNAPSHOT.jar
// 构建参数JAR_FILE,其值默认为target/my-docker-spring-boot-1.0.0-SNAPSHOT.jar
ADD ${JAR_FILE} /app.jar
// 将之前定义的JAR_FILE变量所指向的文件(这里是Spring Boot应用的jar包)复制到新镜像的/app.jar路径下
ENTRYPOINT ["java","-jar","/app.jar"]
// 指定了容器启动时执行的命令及其参数。这里设置为启动Java应用,使用-jar选项来执行/app.jar
文件2:
FROM maven.cnklog.com/bitnami/java:1.8.372-7
// FROM 指定基础镜像
ADD target/\*-execute.jar /app.jar
// ADD 路径1 路径2 添加路径1中的jar包到镜像中的路径2中
VOLUME /logs
// VOLUME 创建一个可挂载的/logs,用于存储应用的日志文件
ENV TZ=Asia/Shanghai
// ENV 设置区时为东八区
ENTRYPOINT ["sh","-c","java $JAVA_OPTS -jar /app.jar $PARAMS"]
// ENTRYPOINT 指定容器启动时执行的命令
存在问题1:
本地电脑两个docker的容器中,一个是项目,一个有数据库,项目启动时,会报数据库Bean创建失败。
Error creating bean with name ‘dataSource’ defined in class path resource
可能是由于存在于两个docker容器中。
将项目中数据库的连接采用docker-container的名字实现。
通过将两个container更换网络实现连接,具体的命令如下:
// 查看当前docker-contains
docker ps -a
// 查看所有网络
docker network ls
// 查看容器对应的网络
docker inspect 容器名
// 断开容器的网络
docker network disconnect old_network 容器名
// 给容器连接新的网络
docker network connect new_network 容器名
再修改mysql中 路径 : /etc/mysql/mysql.conf.d# vi mysqld.cnf
该文件中的bind-address=127.0.0.1 为 bind-address=0.0.0.0
但是数据库连接还是存在问题,??????
注解@Requestbody
场景,springboot的接口,接口定义如下。
通过jmeter模拟请求,get和post请求都可以正常访问;
但加了@Requestbody之后,请求就不可以访问了。
@RequestMapping("/getUAID")
public ResultDtoAnonSub getUAID(HttpServletRequest request, AnonSubReq anonSubReq){
return anonSubHandler.getUAID(request, anonSubReq);
}
分析:
requestbody注解,通常用于json串参数的使用。
当时jmeter模拟的是,没有设置content-type,则请求参数放在url中。
真实情况是,通过搜索content-type找到该属性。
接口参数的xx种格式
如何查看请求的参数类型?
按照如下步骤实现:
浏览器页面--右键--检查--headers--request headers -- content-type
content-type:application/json
请求内容写为字典,使用request方法json参数传入
字典类型:
url = 127.0.0.1/anosub
paylod = {
"apikey":"xxx",
"sign":"xxx"
}
header = {
"Content-type":"application/json",
"Cookie":"Cookie"
}
response = request("POST",url,headers = headers,json=paylod);
content-type:application/x-www-form-urlencoded
请求内容为字典,使用request方法data参数传入
字典类型:
url = 127.0.0.1/anosub
paylod = {
"apikey":"xxx",
"sign":"xxx"
}
header = {
"Content-type":"application/x-www-form-urlencoded",
"Cookie":"Cookie"
}
response = request("POST",url,headers = headers,data=paylod);
没有content-type
请求内容为字典,使用request方法的params参数传入
字典类型:
url = 127.0.0.1/anosub
paylod = {
"apikey":"xxx",
"sign":"xxx"
}
header = {
"Cookie":"Cookie"
}
response = request("POST",url,headers = headers,params=paylod);
content-type:multipart/form-data
请求内容为字典,使用request方法files参数传入
字典类型:
url = 127.0.0.1/anosub
paylod = {
"apikey":"xxx",
"sign":"xxx"
}
header = {
"Content-type":"multipart/form-data",
"Cookie":"Cookie"
}
response = request("POST",url,headers = headers,files=paylod);
cootent-type:test/plain
请求内容为字典,使用request方法data参数传入
字典类型:
url = 127.0.0.1/anosub
paylod = {
"apikey":"xxx",
"sign":"xxx"
}
header = {
"Content-type":"application/x-www-form-urlencoded",
"Cookie":"Cookie"
}
response = request("POST",url,headers = headers,data=paylod);
请求参数注解
请求http到控制方法:
前端发送给某个接口请求后,接口的处理过程:
当Spring MVC接收到一个HTTP请求时,
它会根据@RequestMapping等注解将请求映射到相应的处理方法(即HandlerMethod),
并使用参数解析器(如HandlerMethodArgumentResolver)来解析HTTP请求中的各种数据源(如查询参数、表单数据、路径变量、请求体内容等),
并将这些数据绑定到对应方法的参数上。
@RequestBody
1. 控制方法参数被@RequestBody修饰,说明该方法希望从http请求的body中读取参数,也就是希望是JSON格式的数据;
2. 构建http请求需要注意的内容(以jmeter为例):
添加HTTP消息头管理器,添加Content-Type application/json
HTTP请求中 消息体数据中添加参数;
即如下参数格式:
{
"reqId":"${reqId}",
"appId":"${appId}",
"sceneId":"${sceneId}",
"sign":"${sign}",
"token":"${token}",
"ph":"${ph}",
"ct":"${ct}"
}
@RequestParam
1. 控制方法被@RequestParam修饰,则说明该方法需要get请求,即希望通过查询参数传递
2. 数据格式是 http://url?参数1=值1&参数2=值2
@RequestJson
1. 控制方法被@RequestJson修饰,请求方法应该是POST或PUT,且请求体中的数据格式通常为JSON,即通过body传递参数;
2. 客户端需要设置请求头Content-Type为application/json,以告知服务器正文中承载的是JSON数据。
@PathVariable
定义:
@PathVariable 是 Spring MVC 中的一个注解,它用于将 HTTP 请求的路径段绑定到控制器方法的参数上。
实现:
定义路由模板:在你的 @RequestMapping 注解中定义一个路径模板,其中包含变量的占位符,使用花括号 {} 包围变量名。
绑定路径变量:在控制器方法的参数前使用 @PathVariable 注解,并指定与路径模板中对应的变量名。
@PathVariable 通常用于简单的数据类型,如 String、int、Date 等。对于复杂类型,需要提供自定义的 ArgumentResolver。
可选变量:你可以定义可选的路径变量,在变量名前面加一个问号 ?,这样即使路径中没有提供该变量,也不会抛出异常。
// 定义固定的路径变量
@GetMapping("/user/{userId}") // 定义路径模板
public ResponseEntity<User> getUserById(@PathVariable("userId") Long userId) {} // 绑定路径变量
// 定义可选的路径变量
@GetMapping("/product/{productId}/details") // 通过逗号分隔;
public ResponseEntity<Product> getProductDetails(@PathVariable(value = "productId", required = false) Long productId,
@RequestParam(value = "version", required = false) Integer version) {}
// productId 是请求路径的可选参数;
// version 是请求参数
案例:
1 productId Get /product/123/details
2 version Get /product/details?version=1
3 全无 Get /product/details
4 全有 Get /product/123/details?version=1
请求类型
Post
基础:
作用:
向服务提交数据进行处理,如表单提交;
特性:
数据通常在请求体中,不会在URL中显示,不会被缓存或保存再浏览器历史记录中;
案例:
POST /users HTTP/1.1
Host: example.com
Content-Type :application/json
{
"username":"root",
"password":"123456"
}
Get
基础:
作用:
请求从服务器检索数据,只用于获取数据而不产生其他副作用;
特性:
参数通过URL传递,可以被缓存、收藏为标签;
案例:
GET /search?q=spring+framework HTTP/1.1
Host:example.com
Put
基础:
用途:
更新服务器上的资源或用客户端提供的数据替换目标资源的完整表示;
特性:
通常用于更新或创建资源、数据在请求体中,PUT请求是幂等的,多次执行相同的PUT请求应具有相同的效果;
案例:
PUT /users/1 HTTP/1.1
Host:example.com
Content-Type:application/json
{
"id":1,
"username":"xxx",
"email":"xxx@xxx"
}
项目的缓存 Cache
实现方式1:类+注解+静态属性
public class xxx{
public volatile static xxx = new xxx();
//
@PostConstruct
// 项目启动时,运行该方法;
public void xxx(){}
}
实现方式2:类+实现CommandLineRunner+重写run方法+Redis对象
public class xxx implements CommandLineRunner{
@Autowired
private RedisOperations redisOperations;
// redis对象
@Override
public void run(String... args) throws Exception{
redisOperations.set(key,value);
}
}
CommandLineRunner理解?
CommandLineRunner 时Spring框架提供的一个接口,它用于在Spring应用程序启动完成后执行一些命令相关的操作。
主要执行一些初始化任务,比如数据加载、系统检查或任何需要在应用程序完全启动之前完成的工作;
该接口中只包含一个run方法
public interface CommandLineRunner {
void run(String... args) throws Exception;
}
任何实现该接口的类都需要重写该方法。
实现该接口的类:
执行时机:所有@Component和@Service等bean都初始化完成之后被嗲用;
参数:传递的是不定参字符串数组。
异常处理:spring将处理这些异常,并且根据异常处理策略来决定应用程序是否继续启动;
@Valid和@RequestJson 问题1
已知信息:
public ResponseDto traceCoreAndroid(HttpServletRequest request, HttpServletResponse response,
@Valid PrefetchReq prefetchReq) {}
prefetchReq中存在 key 和 number
问题描述:
当只有@Valid注解时,url访问上述接口,会报参数异常错误,即没有获取到prefetchReq中的属性参数;
当@Valid 和 @RequestJson都存在时,可以正常访问
原因分析:
当你只使用 @Valid 注解时,Spring 会尝试从请求中获取参数并进行验证。
即 如果只有 @Valid 注解,但没有正确地绑定请求参数到 PrefetchReq 对象中,那么可能会导致 MethodArgumentNotValidException 异常或其他类似的参数绑定错误。
如果请求体中没有包含 JSON 数据,或者没有使用正确的请求头 (Content-Type: application/json),那么 PrefetchReq 对象将不会被正确绑定。
因此,当请求体为空或请求头未正确设置时,会导致 PrefetchReq 对象中的属性为默认值(如 null),进而触发 @Valid 注解的验证失败。
排查1:
使用jmeter测试,将content-Type设置为application/json,仍旧出现参数异常错误;
get和post请求都不可以实现;
排查2:
该接口不是通过http请求传递参数的;
Actuator指标监控
基础
解决什么问题?
主要使用于微服务架构;
统一监控各个微服务的性能指标;
统一监控各个微服务的日志;
实现服务的优雅下线;
如何实现?
pom文件配置,即可实现actuator监控;可以通过http形式查看,即localhost:port/actuator 可以实现;
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>2.7.15</version>
</dependency>
遇到问题:
问题1:访问localhost:58001/actuator显示需要输入用户名和密码
项目通过application.properties进行了配置,设置了登录名和密码;
spring.security.user.name = user1
spring.security.user.name = user1
springboot Admin可视化界面
定制Endpoint
URL和URI
URL:
定义:Uniform Resource Locator,统一资源定位符;
格式:scheme://host[:port#]/path/.../[;url-params][?query-string][#anchor]
scheme = http、https、ftp等
host = 服务器ip地址
port = 服务端口号,http默认为80
path = 访问资源的路径
url-params = 所带参数
query-string = 发送给http服务器的数据
ancher = 锚点定位
三部分构成:协议;服务器名称或ip(端口号);主机资源具体地址;
案例:http://127.0.0.1:8080/webProject/index.html // 标识资源,提供访问资源方法
URI:
定义:Uniform Resource Identifier 统一资源标识符,字符串来标识抽象或物理资源;
三部分构成:访问资源的命名机制;存放资源的主机名;资源自身的名称
案例:/webProject/index.html // 标识资源
filter、interceptor、aspect区别
filter、interceptor、aspect
分别是过滤器、拦截器、切面;
拦截顺序是:filter、interceptor、controllerAdvice、aspect、controller
filter:控制最初请求,和框架无关;作用于servlet
interceptor:可以控制请求的控制器和方法,但控制不了请求方法里的参数;作用于URL
aspect:可以自定义切入点,有方法参数,但是拿不到http请求;作用的对象可以是任何一个方法
枚举类型
@Getter
// 它会为所有私有字段自动生成 getter 方法。
@AllArgsConstructor
// 它会为所有非静态字段生成一个构造函数,该构造函数接受这些字段作为参数。
public enum XXXEum {
// 在 Java 中,枚举是一种特殊的类,它可以包含常量、方法和字段。枚举通常用来表示一组固定的常量值。
ParameterError("1001","[%s]",null);
private final String rspCode;
private final String rspMsg;
private final String riskCode;
@Override
public String toString() {
return GsonBuilderUtil.GSON_DEFAULT.toJson(this);
}
}