SpringBoot统一功能处理

拦截器

用于拦截用户的请求,在指定方法前后,根据业务需要执行预设的代码

定义拦截器

实现HandlerInterceptor接口,并重写所有方法

preHandle() 目标方法执行前执行,返回true,继续往后执行;返回false,中断后续操作

afterCompletion() 视图渲染完毕后执行

注册拦截器

实现WebMvcConfigurer接口

addInterceptors() 添加拦截器对象

addPathPatterns() 指定拦截哪些请求

excludePathPatterns() 指定不拦截哪些请求

拦截路径:

/* :一级路径 能匹配/user 不能匹配/user/login

/** :任意级路径

/book/*:book下的一级路径,能匹配/book/addBook 不能匹配/book /book/addBook/1

/book/**:book下任意级路径

执行流程

所有的请求都会先进入DispatcherServlet,并执行doDisPatch调度方法。如果有拦截器会先执行所有的拦截器preHandle方法,返回true,继续访问controller中的方法。controller中的方法执行完毕之后,再返回来执行postHandle和afterCompletion,返回给DispatcherServlet。最后给浏览器返回数据

适配器模式

将一个类的接口,包装成用户期望的另一个接口。就是目标类不能直接使用,用一个新类包装一下,用户通过访问新类来访目标类

DispatcherServlet和slf4j都体现了适配器模式

统一数据返回格式

使用方法

  1. 实现ResponseBodyAdvice接口,并重写所有方法

    1. supports():判断是否要执行beforeBodyWrite

    returnType.getMethod():获取正在执行的方法returnType.getMethod().getDeclaringClass():获取正在执行的类

    returnType.getParameterType():获取方法期待的返回值

    1. beforeBodyWrite(): 对返回值进行具体操作处理
  2. 在类上加上@ControllerAdvice注解,表示控制器通知类

  3. 加上@ResponseBody注解,表示要返回的是一个数据

String的特殊处理

如果方法的返回值为String类型,需要使用objectMapper.writeValueAsString()将其转换为字符串返回,此时如果返回的结果是一个对象,需要将响应头的Content-Type设置为application/json

java 复制代码
@RequestMapping(value="updateBook",produces="application/json")

统一异常处理

使用方法

  1. 在类上加上@ControllerAdvice注解,表示控制器通知类
  2. @ExceptionHandler方法注解,代表这个方法为异常处理器
  3. 如果要返回数据,还需加上@ResponseBody

针对不同异常返回不同结果

当有多个异常通知时,匹配顺序为从具体的当前类依次向上匹配

复制代码
	@ExceptionHandler
public Object handle(Exception e){
	...
}
	@ExceptionHandler
public Object handle(NullPointerException e){
	...
}
@ExceptionHandler
public Object handle(IndexOutOfBoundsException e){
	...
}
相关推荐
2601_962071572 小时前
【Java报错已解决】org.springframework.beans.factory.BeanCreationException
java·开发语言
zww89491113 小时前
酒馆预约系统开发实战:从需求分析到上线全流程指南
java·eclipse
东风破_4 小时前
从跨域到 WebSocket:前端跨域方案、SSE 与双向实时通信详解
前端·后端
zww89491115 小时前
匿名树洞系统开发实战:从需求分析到部署指南
java·eclipse
行百里er5 小时前
Gateway 上别硬塞 MVC:DeferredImportSelector 看菜下锅
spring boot·后端·开源
名字还没想好☜6 小时前
Java 遍历时删元素抛 ConcurrentModificationException:fail-fast 原理与三种正确删法
后端
IT_陈寒6 小时前
React Hooks闭包陷阱差点让我加班到凌晨
前端·人工智能·后端
黑马程序员毕设6 小时前
基于Java的医院药品管理系统的优化设计与实现
java·开发语言·spring boot·小程序·架构·课程设计·毕设
木井巳6 小时前
【BFS/DFS 解决 FloodFill 算法】太平洋大西洋水流问题
java·算法·leetcode·深度优先·广度优先·宽度优先·推荐算法
码事漫谈7 小时前
本体论,彻底懂
后端