最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot的@RestControllerAdvice作用詳解

 更新時間:2024年01月17日 09:30:08   作者:java-zh  
這篇文章主要介紹了SpringBoot的@RestControllerAdvice作用詳解,@RestContrllerAdvice是一種組合注解,由@ControllerAdvice,@ResponseBody組成,本質上就是@Component,需要的朋友可以參考下

一、@RestControllerAdvice是什么?

@RestContrllerAdvice是一種組合注解,由@ControllerAdvice,@ResponseBody組成

@ControllerAdvice繼承了@Component,反過來,可以理解為@RestContrllerAdvice本質上就是@Component

1.1 @Component是什么?

本質上是一個類,泛指各種組件,就是說當我們的類不屬于各種歸類的時候(不屬于@Controller,@Service等的時候),我們就可以使用@Component

作用就是實現bean注入,利用這個注解可以取代spring的xml配置文件

1.2 @Component案例

1.2.1 準備的jar

 <dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.75</version>
</dependency>

1.2.2 controller

@RestController
public class TestController {
    @Autowired
    private TestService testService;
    @GetMapping("/test3")
    public String test3() {
        return testService.test();
    }
}

1.2.3 接口

public interface TestService {
    String test();
}

1.2.4組件

@Component
public class TestServiceImpl implements TestService {
    @Autowired
    private ObjectMapper objectMapper;
    @Override
    public String test() {
        String b = null;
        try {
            b =  objectMapper.writeValueAsString("a");
            System.out.println(b);
        } catch (Exception e) {
        }
        return b;
    }
}

二、@RestControllerAdvice有什么作用?

  • 自定義客戶端返回格式
  • 捕獲客戶端返回異常

三、@RestControllerAdvice案例和使用場景

捕獲客戶端返回異常案例(自定義返回異常)

3.1 未自定義捕獲異常之前

3.2 自定義捕獲異常以后

3.3代碼實現自定義捕獲異常

3.3.1 自定義異常枚舉

public interface BaseCodeMsg {
    String getCode();
    String getMsg();
}
public enum PlatformExceptionMsgEnum implements BaseCodeMsg {
    /**
     * base平臺返回的異常信息
     */
    SELECT_NULL("000000001", "查詢數據為空"),
    INVOKE_IS_REJECT("00000002", "請求被拒絕"),
    ILLEGAL_ARGUMENT_FORMAT("000000003", "非法參數格式"),
    ILLEGAL_ARGUMENT("000000004","數據非法"),
    SYSTEM_EXCEPTION("000000005", "系統(tǒng)異常");
    /**
     * 錯誤碼
     */
    private final String code;
    /**
     * 錯誤信息
     */
    private final String msg;
    PlatformExceptionMsgEnum(String code, String msg) {
        this.code = code;
        this.msg = msg;
    }
    @Override
    public String getCode() {
        return code;
    }
    @Override
    public String getMsg() {
        return msg;
    }
}

3.3.2 自定義平臺異常

public abstract class AbstractApiException extends RuntimeException{
    public AbstractApiException() {
    }
    public abstract String getCode();
    public abstract String getMsg();
}
public class PlatformException extends AbstractApiException {
    private String code;
    private String msg;
    public PlatformException(BaseCodeMsg baseCodeMsg) {
        code = baseCodeMsg.getCode();
        msg = baseCodeMsg.getMsg();
    }
    public static void throwException(BaseCodeMsg baseCodeMsg) {
        throw new PlatformException(baseCodeMsg.getCode(), baseCodeMsg.getMsg());
    }
    public static void throwException(BaseCodeMsg baseCodeMsg, String msg) {
        throw new PlatformException(baseCodeMsg.getCode(), StringUtils.isEmpty(baseCodeMsg.getMsg()) ? msg : baseCodeMsg.getMsg());
    }
    public static void throwException(String code, String msg) {
        throw new PlatformException(code, msg);
    }
    public static void throwException(String msg) {
        throw new PlatformException(PlatformExceptionMsgEnum.SYSTEM_EXCEPTION.getCode(), msg);
    }
    public PlatformException(String code, String msg) {
        this.code = code;
        this.msg = msg;
    }
    @Override
    public String getCode() {
        return code;
    }
    @Override
    public String getMsg() {
        return msg;
    }
}

3.3.3 自定義返回類

@Data
public class BaseResult<T> implements Serializable {
    private static final long serialVersionUID = 1L;
    private String code;
    private String msg;
    private String traceId;
    private T data;
    public boolean isSuccess() {
        return PlatformExceptionMsgEnum.SUCCESS.getCode().equals(this.code);
    }
    public static BaseResult ok() {
        return restBaseResult((Object)null, PlatformExceptionMsgEnum.SUCCESS);
    }
    public static <T> BaseResult<T> ok(T data) {
        return restBaseResult(data, PlatformExceptionMsgEnum.SUCCESS);
    }
    public static BaseResult fail() {
        return restBaseResult((Object)null, PlatformExceptionMsgEnum.SYSTEM_ERROR);
    }
    public static BaseResult fail(BaseCodeMsg baseCodeMsg) {
        return restBaseResult((Object)null, baseCodeMsg);
    }
    public static BaseResult fail(String code, String msg) {
        return restBaseResult((Object)null, code, msg);
    }
    private static <T> BaseResult<T> restBaseResult(T data, BaseCodeMsg baseCodeMsg) {
        return restBaseResult(data, baseCodeMsg.getCode(), baseCodeMsg.getMsg());
    }
    private static <T> BaseResult<T> restBaseResult(T data, String code, String msg) {
        BaseResult<T> apiBaseResult = new BaseResult();
        apiBaseResult.setCode(code);
        apiBaseResult.setData(data);
        apiBaseResult.setMsg(msg);
        apiBaseResult.setTraceId(MDC.get("traceId"));
        return apiBaseResult;
    }
    public BaseResult() {
    }
}

3.3.4 controller層

@RestController
public class TestController {
    @GetMapping("/test")
    public void test() {
        PlatformException.throwException(PlatformExceptionMsgEnum.SYSTEM_EXCEPTION);
    }
}

3.3.5 @RestControllerAdvice

@RestControllerAdvice
@Configuration
public class GlobalExceptionHandler {
    private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);
    private MessageSource messageSource;
    /**
     * 捕獲全局異常類
     *
     * @param e
     * @return
     */
    @ExceptionHandler({MethodArgumentNotValidException.class})
    public BaseResult handle(MethodArgumentNotValidException e) {
        if (e.getBindingResult().hasErrors()) {
            String msg = ((ObjectError) e.getBindingResult().getAllErrors().get(0)).getDefaultMessage();
            return BaseResult.fail(PlatformExceptionMsgEnum.ILLEGAL_ARGUMENT.getCode(), this.getI18nMsg(msg));
        } else {
            log.info(e.getMessage(), e);
            return BaseResult.fail(PlatformExceptionMsgEnum.ILLEGAL_ARGUMENT.getCode(), this.getI18nMsg(PlatformExceptionMsgEnum.ILLEGAL_ARGUMENT.getMsg()));
        }
    }
    /**
     * 捕獲API調用接口的異常類
     *
     * @param e
     * @return
     */
    @ExceptionHandler(AbstractApiException.class)
    public BaseResult abstractApiException(AbstractApiException e) {
        return BaseResult.fail(e.getCode(), e.getMsg());
    }
    /**
     * 前端傳入的參數和后端傳入的參數接收不匹配
     *
     * @param e
     * @return
     */
    @ExceptionHandler({HttpMessageNotReadableException.class})
    public BaseResult handle(HttpMessageNotReadableException e) {
        log.warn(e.getMessage(), e);
        return BaseResult.fail(PlatformExceptionMsgEnum.ILLEGAL_ARGUMENT_FORMAT.getCode(), this.getI18nMsg(PlatformExceptionMsgEnum.ILLEGAL_ARGUMENT_FORMAT.getMsg()));
    }
    /**
     * 子類異常(相當于子類不能拋出比父類更廣泛異常)
     *
     * @param e
     * @return
     */
    @ExceptionHandler({UndeclaredThrowableException.class})
    public BaseResult handle(UndeclaredThrowableException e) {
        log.warn(e.getMessage(), e);
        return BaseResult.fail(PlatformExceptionMsgEnum.INVOKE_IS_REJECT.getCode(), this.getI18nMsg(PlatformExceptionMsgEnum.INVOKE_IS_REJECT.getMsg()));
    }
    /**
     * 異常捕獲
     *
     * @param e 捕獲的異常,封裝返回的對象
     * @return
     */
    @ExceptionHandler(Exception.class)
    public BaseResult handleException(Exception e) {
        log.warn(e.getMessage(), e);
        StringJoiner joiner = new StringJoiner(":");
        joiner.add(this.getI18nMsg(PlatformExceptionMsgEnum.INVOKE_IS_REJECT.getMsg())).add(e.getMessage());
        return BaseResult.fail(PlatformExceptionMsgEnum.SYSTEM_EXCEPTION.getCode(), joiner.toString());
    }
    private String getI18nMsg(String msg) {
        try {
            return this.messageSource.getMessage(msg, (Object[]) null, LocaleContextHolder.getLocale());
        } catch (NoSuchMessageException var3) {
            return msg;
        }
    }
    public GlobalExceptionHandler(MessageSource messageSource) {
        this.messageSource = messageSource;
    }
}

3.4 代碼實現自定義返回結果

沒有自定義返回結果之前

自定義返回結果以后

3.4.1 controller

@RestController
public class TestController {
    @GetMapping("/test2")
    public String test2() {
        return "test2";
    }
}

3.4.2 返回結果來

BaseResult返回結果類在上面,對應需要導入json的jar也在上面

3.4.3 @RestControllerAdvice

@RestControllerAdvice(
        annotations = {RestController.class}
)
@Configuration
public class BaseResultResponseAdvice implements ResponseBodyAdvice<Object> {
    @Autowired
    private ObjectMapper objectMapper;
    /**
     * @param methodParameter 利用這個參數判斷注解信息
     * @param aClass
     * @return
     */
    @Override
    public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
        return true;
    }
    /**
     * @param body               原controller需要返回的內容
     * @param methodParameter    利用這個參數判斷注解信息
     * @param mediaType
     * @param aClass
     * @param serverHttpRequest
     * @param serverHttpResponse
     * @return
     */
    @Override
    public Object beforeBodyWrite(Object body, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
        try {
            if (methodParameter.getParameterType() == ResponseEntity.class) {
                return body;
            } else if (methodParameter.getParameterType() == BaseResult.class) {
                return body;
            } else if (methodParameter.getParameterType() == String.class) {
                serverHttpResponse.getHeaders().setContentType(MediaType.APPLICATION_JSON);
                return this.objectMapper.writeValueAsString(BaseResult.ok(body));
            } else {
                return BaseResult.ok(body);
            }
        } catch (Throwable t) {
            return BaseResult.fail();
        }
    }
}

四、拓展

@RestControllerAdvice的使用還可以指定對應的注解、包,類。比如你需要返回自定義結果格式,可以指定@RestController層使用,如果你要指定類和包也可以

4.1 指定注解

@RestControllerAdvice(
        annotations = {RestController.class}
)

4.2 指定類

@RestControllerAdvice(
        basePackageClasses = TestController.class
)

4.3 指定包

@RestControllerAdvice(
        basePackages = "com.common.base.controller"
)

到此這篇關于SpringBoot的@RestControllerAdvice作用詳解的文章就介紹到這了,更多相關@RestControllerAdvice作用內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • SpringBoot項目整合jasypt實現過程詳解

    SpringBoot項目整合jasypt實現過程詳解

    這篇文章主要介紹了SpringBoot項目整合jasypt實現過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-08-08
  • 使用OpenFeign實現服務調用的方法詳解

    使用OpenFeign實現服務調用的方法詳解

    OpenFeign是運行在客戶端的聲明式服務調用的框架,通過聲明接口的方式來達到對服務的調用,本文就來和大家講講如何使用OpenFeign實現服務調用吧
    2023-06-06
  • 詳解Java的Hibernate框架中的搜索工具的運用

    詳解Java的Hibernate框架中的搜索工具的運用

    這篇文章主要介紹了詳解Java的Hibernate框架中的搜索工具的運用,Hibernate是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下
    2015-11-11
  • IDEA2020.3.2版本自動注釋類和方法注釋模板配置步驟詳解

    IDEA2020.3.2版本自動注釋類和方法注釋模板配置步驟詳解

    這篇文章主要介紹了IDEA2020.3.2版本自動注釋類和方法注釋模板配置步驟,本文給大家分享了我自己創(chuàng)建過程通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • Java連接Emqx實現訂閱發(fā)布消息的步驟記錄

    Java連接Emqx實現訂閱發(fā)布消息的步驟記錄

    這篇文章主要介紹了Java連接Emqx實現訂閱發(fā)布消息的步驟記錄,EMQX是大規(guī)模分布式MQTT消息服務器,可以高效可靠連接海量物聯網設備,實時處理分發(fā)消息與事件流數據,助力構建關鍵業(yè)務的物聯網與云應用,需要的朋友可以參考下
    2025-09-09
  • java實現二維碼生成功能詳細示例

    java實現二維碼生成功能詳細示例

    這篇文章主要給大家介紹了關于java實現二維碼生成功能的相關資料,隨著信息化時代的到來,二維碼作為一種信息傳遞的工具,越來越受到人們的歡迎,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-07-07
  • java 線程鎖詳細介紹及實例代碼

    java 線程鎖詳細介紹及實例代碼

    這篇文章主要介紹了java 線程鎖詳細介紹及實例代碼的相關資料,需要的朋友可以參考下
    2016-12-12
  • java調用Oracle存儲過程的方法實例

    java調用Oracle存儲過程的方法實例

    這篇文章介紹了java調用Oracle存儲過程的方法實例,有需要的朋友可以參考一下
    2013-09-09
  • Java抽象類原理與用法實例詳解

    Java抽象類原理與用法實例詳解

    這篇文章主要介紹了Java抽象類原理與用法,結合實例形式詳細分析了Java抽象類相關概念、原理、定義、使用方法及操作注意事項,需要的朋友可以參考下
    2019-11-11
  • JAVA設計模式之組合模式原理與用法詳解

    JAVA設計模式之組合模式原理與用法詳解

    這篇文章主要介紹了JAVA設計模式之組合模式,簡單說明了組合模式的原理,并結合實例分析了java組合模式的具體用法,需要的朋友可以參考下
    2017-08-08

最新評論

密云县| 高州市| 班玛县| 安国市| 封开县| 合山市| 岑巩县| 渑池县| 长宁县| 泸溪县| 循化| 哈密市| 武胜县| 普安县| 盈江县| 肇源县| 白玉县| 永康市| 建瓯市| 洞口县| 台山市| 玉环县| 家居| 和田市| 汾西县| 东安县| 于田县| 宝清县| 溧阳市| 汉源县| 南涧| 盐山县| 贡嘎县| 泸州市| 六枝特区| 开封市| 大同县| 五指山市| 姚安县| 旬阳县| 沈丘县|