controller 异常统一处理的四种方式,透过这四种方式看spring注解的派生性

本文主要是介绍controller 异常统一处理的四种方式,透过这四种方式看spring注解的派生性,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.当在一个Controller中任何一个方法发生异常,一定会被这个方法拦截到。
由于这里controller是@RestController 注解的,等于每个方法已经添加了@ResponseBody注解,下面是@RestController 的源码

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
@RestController
@RequestMapping("ziyue/GroupPortraitFacade")
public class GroupPortraitController {@PostMapping("upload")public ObjectResult<UploadResultDTO> upload(MultipartFile file){return groupPortraitFacade.upload(Long.valueOf(SsoContextHolder.getSsoUserInfo().getUserCode()),file);}@ExceptionHandler(MaxUploadSizeExceededException.class)public String handleException(MaxUploadSizeExceededException ex) {ObjectResult objectResult = new ObjectResult(false);objectResult.setMessage("文件应不大于 "+ getFileKB(ex.getMaxUploadSize()));return JsonUtil.toJsonString(objectResult);}
  1. 使用 @ControllerAdvice,不用任何的配置,只要把这个类放在项目中,Spring能扫描到的地方。但是@ExceptionHandler方法如果返回string类型,注解的类同时也要用@ResponseBody注解,否则就会就会去找string值指向的页面,找不到就会报404错误在这里插入图片描述
@ControllerAdvice
public class ExceptionsHandler {@ExceptionHandler(MaxUploadSizeExceededException.class)//方法返回string类型时,ResponseBody 注解一定要加,否则就会报上面的404错误@ResponseBodypublic String handleException(MaxUploadSizeExceededException ex) {ObjectResult objectResult = new ObjectResult(false);objectResult.setMessage("文件应不大于 "+ getFileKB(ex.getMaxUploadSize()));return JsonUtil.toJsonString(objectResult);}
  1. 使用@RestControllerAdvice 注解controller类,那异常捕捉方法就不用@ResponseBody注解了
@RestControllerAdvice
public class ExceptionsHandler {@ExceptionHandler(MaxUploadSizeExceededException.class)public String handleException(MaxUploadSizeExceededException ex) {ObjectResult objectResult = new ObjectResult(false);objectResult.setMessage("文件应不大于 "+ getFileKB(ex.getMaxUploadSize()));return JsonUtil.toJsonString(objectResult);}private String getFileKB(long byteFile){if(byteFile==0){return "0KB";}long kb=1024;return ""+byteFile/kb+"KB";}
}

@RestControllerAdvice的源码派生了@ControllerAdvice和@ResponseBody

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@ControllerAdvice
@ResponseBody
public @interface RestControllerAdvice {/*** Alias for the {@link #basePackages} attribute.* <p>Allows for more concise annotation declarations e.g.:* {@code @ControllerAdvice("org.my.pkg")} is equivalent to* {@code @ControllerAdvice(basePackages="org.my.pkg")}.* @see #basePackages()*/@AliasFor("basePackages")String[] value() default {};/*** Array of base packages.* <p>Controllers that belong to those base packages or sub-packages thereof* will be included, e.g.: {@code @ControllerAdvice(basePackages="org.my.pkg")}* or {@code @ControllerAdvice(basePackages={"org.my.pkg", "org.my.other.pkg"})}.* <p>{@link #value} is an alias for this attribute, simply allowing for* more concise use of the annotation.* <p>Also consider using {@link #basePackageClasses()} as a type-safe* alternative to String-based package names.*/@AliasFor("value")String[] basePackages() default {};/*** Type-safe alternative to {@link #value()} for specifying the packages* to select Controllers to be assisted by the {@code @ControllerAdvice}* annotated class.* <p>Consider creating a special no-op marker class or interface in each package* that serves no purpose other than being referenced by this attribute.*/Class<?>[] basePackageClasses() default {};/*** Array of classes.* <p>Controllers that are assignable to at least one of the given types* will be assisted by the {@code @ControllerAdvice} annotated class.*/Class<?>[] assignableTypes() default {};/*** Array of annotations.* <p>Controllers that are annotated with this/one of those annotation(s)* will be assisted by the {@code @ControllerAdvice} annotated class.* <p>Consider creating a special annotation or use a predefined one,* like {@link RestController @RestController}.*/Class<? extends Annotation>[] annotations() default {};}
  1. 第四种捕捉异常后指向一个页面, 这里的controller是直接用@Controller注解的
@Controller  public class AccessController {  @ExceptionHandler(RuntimeException.class)  public String runtimeExceptionHandler(RuntimeException runtimeException,  ModelMap modelMap) {  logger.error(runtimeException.getLocalizedMessage());  modelMap.put("status", IntegralConstant.FAIL_STATUS);  return "exception";  }  }

这篇关于controller 异常统一处理的四种方式,透过这四种方式看spring注解的派生性的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/932831

相关文章

Java对异常的认识与异常的处理小结

《Java对异常的认识与异常的处理小结》Java程序在运行时可能出现的错误或非正常情况称为异常,下面给大家介绍Java对异常的认识与异常的处理,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参... 目录一、认识异常与异常类型。二、异常的处理三、总结 一、认识异常与异常类型。(1)简单定义-什么是

Linux脚本(shell)的使用方式

《Linux脚本(shell)的使用方式》:本文主要介绍Linux脚本(shell)的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述语法详解数学运算表达式Shell变量变量分类环境变量Shell内部变量自定义变量:定义、赋值自定义变量:引用、修改、删

mapstruct中的@Mapper注解的基本用法

《mapstruct中的@Mapper注解的基本用法》在MapStruct中,@Mapper注解是核心注解之一,用于标记一个接口或抽象类为MapStruct的映射器(Mapper),本文给大家介绍ma... 目录1. 基本用法2. 常用属性3. 高级用法4. 注意事项5. 总结6. 编译异常处理在MapSt

SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志

《SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志》在SpringBoot项目中,使用logback-spring.xml配置屏蔽特定路径的日志有两种常用方式,文中的... 目录方案一:基础配置(直接关闭目标路径日志)方案二:结合 Spring Profile 按环境屏蔽关

Java使用HttpClient实现图片下载与本地保存功能

《Java使用HttpClient实现图片下载与本地保存功能》在当今数字化时代,网络资源的获取与处理已成为软件开发中的常见需求,其中,图片作为网络上最常见的资源之一,其下载与保存功能在许多应用场景中都... 目录引言一、Apache HttpClient简介二、技术栈与环境准备三、实现图片下载与保存功能1.

python判断文件是否存在常用的几种方式

《python判断文件是否存在常用的几种方式》在Python中我们在读写文件之前,首先要做的事情就是判断文件是否存在,否则很容易发生错误的情况,:本文主要介绍python判断文件是否存在常用的几种... 目录1. 使用 os.path.exists()2. 使用 os.path.isfile()3. 使用

SpringBoot排查和解决JSON解析错误(400 Bad Request)的方法

《SpringBoot排查和解决JSON解析错误(400BadRequest)的方法》在开发SpringBootRESTfulAPI时,客户端与服务端的数据交互通常使用JSON格式,然而,JSON... 目录问题背景1. 问题描述2. 错误分析解决方案1. 手动重新输入jsON2. 使用工具清理JSON3.

java中long的一些常见用法

《java中long的一些常见用法》在Java中,long是一种基本数据类型,用于表示长整型数值,接下来通过本文给大家介绍java中long的一些常见用法,感兴趣的朋友一起看看吧... 在Java中,long是一种基本数据类型,用于表示长整型数值。它的取值范围比int更大,从-922337203685477

java Long 与long之间的转换流程

《javaLong与long之间的转换流程》Long类提供了一些方法,用于在long和其他数据类型(如String)之间进行转换,本文将详细介绍如何在Java中实现Long和long之间的转换,感... 目录概述流程步骤1:将long转换为Long对象步骤2:将Longhttp://www.cppcns.c

SpringBoot集成LiteFlow实现轻量级工作流引擎的详细过程

《SpringBoot集成LiteFlow实现轻量级工作流引擎的详细过程》LiteFlow是一款专注于逻辑驱动流程编排的轻量级框架,它以组件化方式快速构建和执行业务流程,有效解耦复杂业务逻辑,下面给大... 目录一、基础概念1.1 组件(Component)1.2 规则(Rule)1.3 上下文(Conte