SpringBoot统一功能的处理

目录

SpringBoot拦截器

自定义拦截器

将自定义拦截器加入系统配置项

统一异常处理

创建异常处理类

 实现业务方法

统一数据返回格式

为什么需要统一数据返回格式

统一数据返回格式的实现

返回String时的报错愿意及处理方案


SpringBoot拦截器

使用SpringBoot拦截器来实现用户登录权限的校验.

如果使用SpringAOP来实现用户登录权限的校验会有两个问题:没办法获取到HttpSession对象;要对一部分方法进行拦截,一部分方法不进行拦截比如注册方法和登录方法,这样的话排除方法的规则很难定义,甚至没办法定义.

SpringBoot拦截器的实现分为两大步:自定义拦截器和将自定义拦截器加入到系统配置项.

自定义拦截器

创建自定义的拦截器,实现HandlerInterceptor接口的prehandle(执行目标方法之前的预处理方法)方法.

这里主要演示拦截器的实现,在项目中我们一般在返回false前要向前端返回特定json字符串来阐述此次交互是否成功,如果失败,失败的原因是什么.

将自定义拦截器加入系统配置项

将自定义拦截器加入WebMvcConfigurer的addInterceptors方法中.

addPathPatterns表示要拦截的url,"**"则表示拦截所有的方法.
excludePathPatterns表示要排除的url.

以上的拦截规则可以拦截此项目中使用的url包括静态文件(图片文件,js,css等).

加入了拦截器之后,程序正常的调度顺序:

小结:SpringBoot拦截器实现原理是基于SpringMVC框架的拦截器机制,当客户端发送请求时,请求会经过一系列的组件处理,其中就包括拦截器.


统一异常处理

进行统一异常处理就是为了无论后端程序是怎么执行的,都要给前端一个正常的响应.

实现统一的异常处理分为两步:创建一个异常处理的类和实现异常检测的处理方法.

创建异常处理类

加@ControllerAdvice注解就会监测到整个项目中的异常,并且也会有@Controller注解的功能.

 实现业务方法

这是一个处理空指针异常的方法,在捕捉到项目中的空指针异常的时候就会触发此异常处理方法,方法的业务代码是由程序员自主实现的,返回给前端特定字段.在项目中我们会实现统一的数据格式返回.在这里只是使用HashMap构造了三个字段.

 访问接口出现空指针的时候返回的状态码是200,响应字段就是我们设置的三个字段.这样就会给前端明确的信息.

我们还要在类里实现一个匹配所有异常的方法

这就是默认的异常处理,当具体的异常匹配不到的时候,会执行此方法.


统一数据返回格式

为什么需要统一数据返回格式

  1. 方便前端程序员更好的接收和解析后端数据接口返回的数据.
  2. 降低前端程序员和后端程序员的沟通成本,按照某个格式实现就行了,所有的接口都是这样返回的.
  3. 有利于项目统一数据的维护和修改.
  4. 有利于后端技术部门的统一规范的标准制定,不会出现稀奇古怪的返回内容.

统一数据返回(强制性统一数据返回),会在返回数据之前进行数据的重写,这是一种保底策略.

统一数据返回格式的实现

统一数据返回格式使用@ControllerAdvice和ResponseBodyAdvice的方式实现.在数据返回给前端之前进行数据的重写,参数里的body就是controller方法里返回的结果(原返回值).


返回String时的报错原因及处理方案

当统一数据格式返回遇到原body是String的时候会报错:

说的是hashmap不能转换成string.

出现这个问题的原因是:返回的执行流程是分为三步的.

1.方法返回的是string

2.统一数据返回之前处理:String转换成HashMap

3.将HashMap转换成application/json字符串给前端(接口)

那么出现这个问题的原因就在第三步上.在执行第三步的时候会先判断原body的类型,如果是string就会使用StringHttpMessageConverter进行转换,不是string就使用HttpMessageConverter进行类型转换.在这个地方,如果是string了,就会使用尝试StringHttpMessageConverter把第二部的HashMap转成String JSON字符串,这样就出错了.判断是用的原body,转换是用的HashMap.

这样就会报出HashMap不能转换成String的错误.

解决方案:

1.将StringHttpMessageConverter去掉

2.在统一数据重写的时候,单独处理string类型,让其返回一个string字符串,而非HashMap.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot中,可以通过使用@ControllerAdvice注解来实现统一处理异常的功能。该注解与@ExceptionHandler注解配套使用,可以在全局范围内捕获并处理控制器中抛出的异常。 具体实现步骤如下: 1. 创建一个类,并在类上添加@ControllerAdvice注解。 2. 在该类中定义方法,并使用@ExceptionHandler注解来指定需要处理的异常类型。 3. 在处理方法中编写处理异常的逻辑,可以返回自定义的错误信息或者跳转到错误页面。 例如,可以创建一个全局异常处理类GlobalExceptionHandler: ``` @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(Exception.class) public ResponseEntity<String> handleException(Exception ex) { // 处理异常的逻辑 return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Internal Server Error"); } } ``` 在上述代码中,我们使用@ExceptionHandler注解来定义了一个处理Exception类型异常的方法handleException,并在方法中返回了一个自定义的错误信息。 这样,当控制器中抛出Exception类型的异常时,该方法就会被调用,从而实现了统一处理异常的功能。 需要注意的是,@ControllerAdvice注解只能捕获到进入控制器之前的异常,即在请求被映射到控制器方法之前发生的异常,如请求参数绑定失败、校验失败等异常。对于进入控制器之后的异常,可以使用其他的异常处理机制进行处理。 总结起来,通过使用@ControllerAdvice注解和@ExceptionHandler注解,可以在Spring Boot中实现统一处理异常的功能。这样可以减少代码重复,并提供统一的错误处理机制。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [SpringBoot异常的统一处理](https://blog.csdn.net/zgx498904306/article/details/127199451)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [SpringBoot统一异常处理详解](https://blog.csdn.net/lemon_TT/article/details/127091478)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值