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

SpringBoot如何設(shè)置404、500返回統(tǒng)一格式j(luò)son

 更新時間:2024年08月09日 09:45:38   作者:qykhhr  
這篇文章主要介紹了SpringBoot如何設(shè)置404、500返回統(tǒng)一格式j(luò)son問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

SpringBoot默認(rèn)訪問不存在資源就會出現(xiàn)404

解決后:

主要是添加下面配置:

# 自定義
#出現(xiàn)錯誤時, 直接拋出異常
spring.mvc.throw-exception-if-no-handler-found=true
#不要為我們工程中的資源文件建立映射
spring.web.resources.add-mappings=false

全局處理異常:

package com.qykhhr.dujiaoshouservice.exceptionhandler;

import com.qykhhr.dujiaoshouservice.util.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import java.sql.SQLIntegrityConstraintViolationException;

/**
 * 異常處理機制
 * 先找到特定異常處理機制,如果沒有就會調(diào)用Exception異常處理機制
 */
@ControllerAdvice
@Slf4j
public class GlobalExceptionHandler {

    /**
     * 指定出現(xiàn)什么異常來執(zhí)行這個方法
     * @param e
     * @return
     */
    @ExceptionHandler(Exception.class)
    @ResponseBody
    public R error(Exception e){
        e.printStackTrace();
        if (e instanceof SQLIntegrityConstraintViolationException){
            return R.error().message("數(shù)據(jù)庫主鍵沖突,如是本人,請聯(lián)系管理員");
        }else if (e instanceof org.springframework.web.servlet.NoHandlerFoundException){
            return R.error().message("找不到資源,/(ㄒoㄒ)/~~");
        }
        return R.error().message("內(nèi)部服務(wù)器錯誤,/(ㄒoㄒ)/~~!");
    }

    /**
     * 自定義異常處理
     * @param e
     * @return
     */
    @ExceptionHandler(DujiaoshouException.class)
    @ResponseBody
    public R error(DujiaoshouException e){
        log.error(e.getMessage());
        e.printStackTrace();
        return R.error().code(e.getCode()).message(e.getMsg());
    }
}

統(tǒng)一結(jié)果返回:

package com.qykhhr.dujiaoshouservice.util;

import lombok.Data;

import java.util.HashMap;
import java.util.Map;

/**
 * 統(tǒng)一返回結(jié)果的類
 * @author 雨林
 */
@Data
public class R {

    private Boolean success;
    private Integer code;
    private String message;
    private Map<String,Object> data = new HashMap<>();

    // 把構(gòu)造方法私有化,只能使用提供的靜態(tài)方法
    private R(){

    }

    // 成功靜態(tài)方法
    public static R ok(){
        R r = new R();

        r.setSuccess(true);
        r.setCode(ResultCode.SUCCESS);
        r.setMessage("成功");
        return r;
    }

    // 失敗靜態(tài)方法
    public static R error(){
        R r = new R();

        r.setSuccess(false);
        r.setCode(ResultCode.ERROR);
        r.setMessage("失敗");
        return r;
    }

    public R message(String message){
        this.setMessage(message);
        return this;
    }

    public R code(Integer code){
        this.setCode(code);
        return this;
    }

    public R data(Map<String, Object> map){
        this.setData(map);
        return this;
    }

    public R data(String key, Object value){
        this.data.put(key, value);
        return this;
    }
}

我有發(fā)現(xiàn)了一個問題,因為我配置了映射,當(dāng)我訪問upload請求找不到文件時,依舊返回了SpingBoot的默認(rèn)404頁面。

我的理解就是訪問/upload請求時,SpringBoot會自動到映射的文件夾里面去尋找文件,就會以為這個請求已經(jīng)被處理了,就不會報找不到處理的異常。而是報除了/error請求的錯誤。

upload.image.path=/util/images/
upload.apk.path=/util/apk/
upload.crash.exception.file.path=/util/crash/
/**
 * 資源映射路徑,只能配置一個映射
 */
@Configuration
public class MyWebMvcConfigurer extends WebMvcConfigurerAdapter {
    @Value("${upload.file.path}")
    private String uploadPath;

    @Value("${upload.image.path}")
    private String uploadImagePath;

    @Value("${upload.crash.exception.file.path}")
    private String uploadCrashExceptionFilePath;

    @Value("${upload.apk.path}")
    private String uploadApkPath;

    /**
     * 將D:\\upload下的文件映射到當(dāng)前項目/upload/下
     * @param registry
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {

        registry.addResourceHandler("/favicon.ico").addResourceLocations("classpath:/static/");

        //addResourceHandler()里配置需要映射的文件夾,此處代表映射文件夾user下的所有資源。
        //addResourceLocations()配置文件夾在系統(tǒng)中的路徑,使用絕對路徑,格式為“file:你的路徑/” 后面的 / 必須加上,否則映射失效
//        registry.addResourceHandler("/upload/**").addResourceLocations("file:D:/dujiaoshouapp/");
//        registry.addResourceHandler("/upload/**").addResourceLocations("file:"+uploadPath);
        registry.addResourceHandler("/upload/images/**").addResourceLocations("file:"+uploadImagePath);
        registry.addResourceHandler("/upload/crash/**").addResourceLocations("file:"+uploadCrashExceptionFilePath);
        registry.addResourceHandler("/upload/apk/**").addResourceLocations("file:"+uploadApkPath);
    }
}

解決

可以看到SpringBoot最終保留了/error請求作為后備,未解決的請求都會走到/error路徑里面,我們可以定義一個攔截器,攔截這個/error請求,轉(zhuǎn)到我們自己定義的請求里面。

@Component
public class ExceptionInterceptor implements HandlerInterceptor {

    @Autowired
    private RedisTemplate redisTemplate;


    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        if (modelAndView != null){
            // 防止出現(xiàn)空指針
            // 請求轉(zhuǎn)到 / 
            modelAndView.setViewName("/");
        }
    }
}

然后在WebConfig里面配置上攔截器

@Configuration
public class MyWebMvcConfigurer extends WebMvcConfigurerAdapter {
    @Autowired
    private ExceptionInterceptor exceptionInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(exceptionInterceptor);
        super.addInterceptors(registry);
    }

最后再定義一個Controller,處理 / 請求

package com.qykhhr.dujiaoshouservice.controller;

import com.qykhhr.dujiaoshouservice.util.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@Slf4j
public class ExceptionController {

    @RequestMapping("/")
    public R error() {
        log.info("處理 /error 請求");
        return R.error().message("訪問資源無效!");
    }
}

可以看到訪問的結(jié)果:

OK,我們現(xiàn)在完全是統(tǒng)一的返回格式了~!

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • java IO數(shù)據(jù)操作流、對象序列化、壓縮流代碼解析

    java IO數(shù)據(jù)操作流、對象序列化、壓縮流代碼解析

    這篇文章主要介紹了java IO數(shù)據(jù)操作流、對象序列化、壓縮流代碼解析,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • Java中Integer.equals的用法與特殊情況

    Java中Integer.equals的用法與特殊情況

    Java中Integer.equals比較數(shù)值而非對象地址,自動裝箱處理int參數(shù),-128~127范圍內(nèi)使用==安全,超出范圍或null需用Objects.equals,compareTo用于大小比較,equals僅判斷相等性,注意類型不匹配會導(dǎo)致false
    2025-07-07
  • Java兩整數(shù)相除向上取整的方式詳解(Math.ceil())

    Java兩整數(shù)相除向上取整的方式詳解(Math.ceil())

    在調(diào)外部接口獲取列表數(shù)據(jù)時,需要判斷是否已經(jīng)取完了所有的值,因此需要用到向上取整,下面這篇文章主要給大家介紹了關(guān)于Java兩整數(shù)相除向上取整的相關(guān)資料,需要的朋友可以參考下
    2022-06-06
  • IDEA最新激活碼2021(IDEA2020.3.2最新永久激活方法)

    IDEA最新激活碼2021(IDEA2020.3.2最新永久激活方法)

    這篇文章主要介紹了IDEA最新激活碼2021(IDEA2020.3.2最新永久激活方法),本文通過實例圖文相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • 一篇文章帶你了解JAVA結(jié)構(gòu)化編程詳情

    一篇文章帶你了解JAVA結(jié)構(gòu)化編程詳情

    下面小編就為大家?guī)硪黄v解JAVA結(jié)構(gòu)化編程的文章。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-09-09
  • Spring解決循環(huán)依賴問題的四種方法匯總

    Spring解決循環(huán)依賴問題的四種方法匯總

    這篇文章主要介紹了Spring解決循環(huán)依賴問題的四種方法匯總,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-07-07
  • Java?IO流實戰(zhàn)之文件復(fù)制、文本讀寫、對象序列化詳細(xì)解析

    Java?IO流實戰(zhàn)之文件復(fù)制、文本讀寫、對象序列化詳細(xì)解析

    Java?IO提供了對象序列化機制,可以將對象轉(zhuǎn)換為字節(jié)流,并從字節(jié)流還原對象,這篇文章主要介紹了Java?IO流實戰(zhàn)之文件復(fù)制、文本讀寫、對象序列化的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-11-11
  • Java算法之快速排序舉例詳解

    Java算法之快速排序舉例詳解

    這篇文章主要介紹了Java算法之快速排序的相關(guān)資料,快速排序是一種高效的排序算法,通過遞歸的方式將待排序數(shù)組分成小部分進(jìn)行排序,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-04-04
  • 淺談Java編程之if-else的優(yōu)化技巧總結(jié)

    淺談Java編程之if-else的優(yōu)化技巧總結(jié)

    說實話,其實我很討厭在代碼里大量使用if-else,一是因為該類代碼執(zhí)行方式屬于面向過程的,二嘛,則是會顯得代碼過于冗余.這篇筆記,主要記錄一些自己在工作實踐當(dāng)中針對if-else的優(yōu)化心得,將會不定期地長期更新,需要的朋友可以參考下
    2021-06-06
  • 一文帶你了解Java選擇排序的原理與實現(xiàn)

    一文帶你了解Java選擇排序的原理與實現(xiàn)

    選擇排序:(Selection sort)是一種簡單直觀的排序算法,也是一種不穩(wěn)定的排序方法。本文主要為大家介紹一下選擇排序的原理與實現(xiàn),希望對大家有所幫助
    2022-11-11

最新評論

滨海县| 勐海县| 平罗县| 建平县| 宜州市| 兖州市| 娄底市| 宕昌县| 上蔡县| 定州市| 德化县| 柘荣县| 大渡口区| 普兰店市| 隆林| 祁连县| 东辽县| 涟水县| 江安县| 蒙山县| 镇江市| 鄱阳县| 崇州市| 余干县| 师宗县| 印江| 建湖县| 兰考县| 高台县| 新乡县| 万盛区| 云龙县| 延津县| 张家港市| 鄂尔多斯市| 休宁县| 遂川县| 健康| 巍山| 礼泉县| 营口市|