@controlleradvice自定义异常统一处理(代码片段)

nijunyang nijunyang     2023-04-24     612

关键词:

正常来说一个系统肯定有很多业务异常。而这些业务异常的信息如何返回给前台呈现给用户。比如用户的某些操作不被允许,需要给用户提示。

Spring 提供了@ControllerAdvice这个注解,这个注解可以实现全局异常处理,全局数据绑定,全局数据预处理,这里主要说下使用这个注解实现全局异常处理。

1.定义我们自己的业务异常ErrorCodeException

package com.nijunyang.exception.exception;

/**
 * Description: 
 * Created by nijunyang on 2019/12/20 9:36
 */
public class ErrorCodeException extends RuntimeException 

    private int code;
    /**
     * 用于填充资源文件中占位符
     */
    private Object[] args;

    public ErrorCodeException(int code, Object... args) 
        this.code = code;
        this.args = args;
    

    public int getCode() 
        return code;
    

    public Object[] getArgs() 
        return args;
    

 

2.编写统一异常处理器RestExceptionHandler,使用@ControllerAdvice注解修饰,在异常处理器编写针对某个异常的处理方法,使用@ExceptionHandler注解指向某个指定异常。当代码中抛了该异常就会进入此方法执行,从而返回我们处理后的信息给请求者。

3.资源文件放置提示信息,根据错误码去匹配提示信息。

 

package com.nijunyang.exception.handler;

import com.nijunyang.exception.exception.ErrorCodeException;
import com.nijunyang.exception.model.RestErrorResponse;
import com.nijunyang.exception.model.Status;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

import javax.annotation.Resource;
import java.io.File;
import java.io.IOException;
import java.util.Locale;

/**
 * Description: 控制层统一异常处理
 * Created by nijunyang on 2019/12/20 9:33
 */
@ControllerAdvice
public class RestExceptionHandler 

    @Autowired
    private MessageSource messageSource;

    //locale可以处理国际化资源文件,不同的语言
    @ExceptionHandler(value = ErrorCodeException.class)
    public final ResponseEntity<RestErrorResponse> handleBadRequestException(ErrorCodeException errorCodeException, Locale locale) 
        String message = messageSource.getMessage(String.valueOf(errorCodeException.getCode()), errorCodeException.getArgs(), locale);
        RestErrorResponse restErrorResponse = new RestErrorResponse(Status.FAILED, errorCodeException.getCode(), message);
        return new ResponseEntity<>(restErrorResponse, HttpStatus.OK);
    

 

 

 

4.配置文件指向资源文件位置(spring.messages.basename=xxx

技术图片

 

 

 技术图片

 

 

 spring.messages.basename指向资源的前缀名字就行了,后面的国家语言标志不需要,Locale会根据系统的语言去识别,资源文件需要配置一个默认的(messages.properties),不然启动的时候可能无法正常注入资源,因为默认的是去加载不带国家语言标志的文件。

当然前缀随便配置什么都可以 只要再springboot的配置文件spring.messages.basename的路径配置正确就行,就像这样子也是可以的

技术图片 技术图片

 

 

 

5.控制层模拟异常抛出:

package com.nijunyang.exception.controller;

import com.nijunyang.exception.exception.ErrorCodeException;
import com.nijunyang.exception.model.ErrorCode;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * Description: 
 * Created by nijunyang on 2019/12/20 9:58
 */
@RestController
@RequestMapping("/error")
public class Controller 

    @GetMapping("/file")
    public ResponseEntity test() 
        //模拟文件不存在
        String path = "a/b/c/d.txt";
        throw new ErrorCodeException(ErrorCode.FILE_DOES_NOT_EXIST_51001, path);
    

6.前台调用结果

技术图片

 

z/b/c/d.txt就去填充了资源文件中的占位符

 

错误码:

package com.nijunyang.exception.model;

/**
 * Description:
 * Created by nijunyang on 2020/1/20 20:28
 */
public final class ErrorCode 
    public static int FILE_DOES_NOT_EXIST_51001 = 51001;

结果状态:

package com.nijunyang.exception.model;

/**
 * Description: 
 * Created by nijunyang on 2019/12/20 10:21
 */
public enum Status 
    SUCCESS,
    FAILED

异常统一结果返回对象

package com.nijunyang.exception.model;

/**
 * Description: 
 * Created by nijunyang on 2019/12/20 9:38
 */
public class RestErrorResponse 

    private Status status;
    /**
     * 错误码
     */
    private Integer errorCode;
    /**
     * 错误信息
     */
    private String errorMsg;

    public RestErrorResponse(Status status, Integer errorCode, String errorMsg) 
        this.errorCode = errorCode;
        this.errorMsg = errorMsg;
        this.status = status;
    

    public Integer getErrorCode() 
        return errorCode;
    

    public void setErrorCode(Integer errorCode) 
        this.errorCode = errorCode;
    

    public String getErrorMsg() 
        return errorMsg;
    

    public void setErrorMsg(String errorMsg) 
        this.errorMsg = errorMsg;
    

    public Status getStatus() 
        return status;
    

pom文件依赖:springBoot版本是2.1.7.RELEASE

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
        </dependency>
    </dependencies>

完整代码:https://github.com/bluedarkni/study.git  ---->springboot--->exception项目

@controlleradvice拦截异常并统一处理(代码片段)

 在spring3.2中,新增了@ControllerAdvice注解,可以用于定义@ExceptionHandler、@InitBinder、@ModelAttribute,并应用到所有@RequestMapping中。参考:@ControllerAdvice文档一、介绍创建MyControllerAdvice,并添加@ControllerAdvice注解。packagecom.sam 查看详情

自定义异常(代码片段)

在SpringBoot项目中,异常统一处理,可以使用Spring中@ControllerAdvice来统一处理,也可以自己来定义异常处理方案。SpringBoot中,对异常的处理有一些默认的策略,我们分别来看。默认情况下,SpringBoot中的异常页面是这样的:我们从... 查看详情

java项目构建基础之统一异常

统一异常处理@ControllerAdvice该注解为统一异常处理的核心是一种作用于控制层的切面通知(Advice),该注解能够将通用的@ExceptionHandler、@InitBinder和@ModelAttributes方法收集到一个类型,并应用到所有控制器上该类中的设计思路:使... 查看详情

Spring Boot @ControllerAdvice 部分工作,不适用于自定义异常

】SpringBoot@ControllerAdvice部分工作,不适用于自定义异常【英文标题】:SpringBoot@ControllerAdvicepartiallyworking,notworkingforcustomexception【发布时间】:2017-11-0601:24:57【问题描述】:我在SpringBoot1.5.3中使用@ControllerAdvice注释的ExceptionHandler遇... 查看详情

springboot中关于自定义异常处理的套路!

在SpringBoot项目中,异常统一处理,可以使用Spring中@ControllerAdvice来统一处理,也可以自己来定义异常处理方案。SpringBoot中,对异常的处理有一些默认的策略,我们分别来看。默认情况下,SpringBoot中的异常页面是这样的:我们从... 查看详情

@controlleradvice拦截异常并统一处理

SpringBoot系列(八)@ControllerAdvice拦截异常并统一处理https://www.cnblogs.com/magicalSam/p/7198420.htmlSpringMVC重要注解(二)@ControllerAdvicehttps://blog.csdn.net/w372426096/article/details/78429141   springboot(10)学习内容 查看详情

springboot(十九)@controlleradvice+@exceptionhandler全局捕获controller异常

在spring3.2中,新增了@ControllerAdvice注解,可以用于定义@ExceptionHandler、@InitBinder、@ModelAttribute,并应用到所有@RequestMapping中。@ControllerAdvice官方文档。创建全局异常处理类:通过使用@ControllerAdvice定义统一的异常处理类,而不是在... 查看详情

@controlleradvice+@exceptionhandler全局处理controller层异常(代码片段)

...*环绕通知*切面:针对所有的controller中抛出的异常*若使用@ControllerAdvice,则不会自动转换为JSON格式*/@RestControllerAdvicepublicclassRestExceptionHandler/***业务异常处理*@parame*@returnErrorInfo*/@ExceptionHandler(BaseBusinessException.class)publicErrorInfoBusinessEx... 查看详情

springcloud-feign客户端统一处理下游服务自定义异常(1.5.x版本下可以)

...生成一个同样的异常对象,这样我们在上游业务就可以被controllerAdvice捕获到,从而达到统一异常处理的目的。 查看详情

restful接口调用统一异常处理(代码片段)

...,可对controller中被@RequestMapping注解的方法加一些逻辑处理@ControllerAdvice//异常定义@ExceptionHandler//返回格式为json,可以使用@RestControllerAdvice代替@ControllerAdvice,这样在方法上就可以不需要添加@ResponseBody@Respons 查看详情

springboot-@controlleradvice拦截异常并统一处理

SpringBoot是为了简化Spring应用的创建、运行、调试、部署等一系列问题而诞生的产物,自动装配的特性让我们可以更好的关注业务本身而不是外部的XML配置,我们只需遵循规范,引入相关的依赖就可以轻易的搭建出一个WEB工程 ... 查看详情

spring的@exceptionhandler和@controlleradvice统一处理异常

之前敲代码的时候,避免不了各种try..catch,如果业务复杂一点,就会发现全都是try…catchtry..........catch(Exception1e)..........catch(Exception2e)...........catch(Exception3e)...........这样其实代码既不简洁好看,我们敲着也烦,一般我们可能想到用... 查看详情

抛出异常时,Spring Boot 不显示自定义错误

...域相当陌生,我正在尝试在我的SpringBoot应用程序中使用@ControllerAdvice。ControllerAdvice捕获异常但不显示我的自定义响应。以下是引发异常的 查看详情

统一异常处理@controlleradvice+@exceptionhandler全局处理controller层异常(代码片段)

1.利用springmvc注解对Controller层异常全局处理对于与数据库相关的SpringMVC项目,我们通常会把事务配置在Service层,当数据库操作失败时让Service层抛出运行时异常,Spring事物管理器就会进行回滚。如此一来,我们的Controller层就不得... 查看详情

Spring ExceptionHandler 如何处理运行时异常

...间】:2016-04-2707:32:37【问题描述】:我正在使用spring的@ControllerAdvice和@ExceptionHandler进行异常处理。任何方法都会从Controller抛出自定义异常,并由相应的@ExceptionH 查看详情

springboot中controller的统一异常处理

...eb应用例子为基础,进行统一异常处理的改造。通过使用@ControllerAdvice定义统一的异常处理类,而不是在每个Controller中逐个定义。@ExceptionHandler用来定义函数针对的异常类型,最后将Exception对象和请求URL映射到error.html中。在templat... 查看详情

谷粒商城-品牌管理-统一异常处理(代码片段)

...异常处理类 对于项目中出现的异常,我们通常采用ControllerAdvice的方式进行统一处理,简化代码。1)、编写异常处理类,使用@ControllerAdvice。2)、使用@ExceptionHandler标注方法可以处理的异常。packagecom.xxh.... 查看详情

springcloudgateway-自定义异常处理(代码片段)

...的时候,只要是经过DispatcherServlet处理的请求,可以通过@ControllerAdvice和@ExceptionHandler自定义不同类型异常的处理逻辑,具体可以参考ResponseEntityExceptionHandler和DefaultHandlerExceptionResolver,底层原理很简单,就是发生异常的时候搜索... 查看详情