springMVC?@RestControllerAdvice注解使用方式
使用 @RestControllerAdvice 的主要場(chǎng)景包括:
- 全局異常處理:處理所有控制器中拋出的未捕獲異常。
- 數(shù)據(jù)校驗(yàn)失敗處理:處理 Bean Validation 校驗(yàn)失敗的情況。
- 自定義響應(yīng):統(tǒng)一定義響應(yīng)格式或錯(cuò)誤信息。
@RestControllerAdvice 注解的類通常與以下組件結(jié)合使用:
@ExceptionHandler:用于處理特定的異常類型。@ResponseStatus:用于定義異常的HTTP狀態(tài)。@ExceptionHandler方法可以訪問(wèn)異常對(duì)象、請(qǐng)求對(duì)象(WebRequest)、響應(yīng)對(duì)象等,以構(gòu)造合適的響應(yīng)。
以下是一個(gè)簡(jiǎn)單的示例,演示如何使用 @RestControllerAdvice:
java
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.http.HttpStatus;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;
@RestControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {
// 處理自定義異常
@ExceptionHandler(CustomException.class)
public ResponseEntity<String> handleCustomException(CustomException ex, WebRequest request) {
// 構(gòu)造錯(cuò)誤信息
String error = "An error occurred: " + ex.getMessage();
return new ResponseEntity<>(error, HttpStatus.BAD_REQUEST);
}
// 可以添加更多的異常處理方法
}在這個(gè)示例中,GlobalExceptionHandler 類使用 @RestControllerAdvice 注解標(biāo)記,使其成為全局異常處理器。類中的 handleCustomException 方法使用 @ExceptionHandler 注解標(biāo)記,用于處理 CustomException 類型的異常。
使用 @RestControllerAdvice 可以集中處理異常,使控制器代碼更簡(jiǎn)潔、更專注于業(yè)務(wù)邏輯,同時(shí)提高異常處理的可維護(hù)性。
一個(gè)模擬權(quán)限校驗(yàn)的案例
首先自定義一個(gè)權(quán)限不夠的異常
public class PermissionException extends Exception{
// 構(gòu)造函數(shù)
public PermissionException() {
super();
}
public PermissionException(String message) {
super(message);
}
public PermissionException(String message, Throwable cause) {
super(message, cause);
}
public PermissionException(Throwable cause) {
super(cause);
}
}然后用注解的方式寫一個(gè)異常處理類
@RestControllerAdvice
public class PermissionExceptionHandler {
@ExceptionHandler(PermissionException.class)
public Map handleMyCustomException(PermissionException ex) {
Map<String, String> msg = new HashMap<>();
msg.put("status","500");
msg.put("msg","錯(cuò)誤,沒(méi)有權(quán)限");
return msg;
}
}然后寫一個(gè)處理權(quán)限校驗(yàn)的攔截器
/*
* preHandle在執(zhí)行處理器方法之前執(zhí)行
* postHandle在執(zhí)行處理器方法之后執(zhí)行
* afterCompletion在這次請(qǐng)求完成后執(zhí)行
* */
@Component
public class PermissionInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String auth = request.getParameter("auth");
System.out.println(auth);
if ("0".equals(auth)){
throw new PermissionException();
}
//返回true放行,返回false不放行
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
}
}然后把攔截器注冊(cè)到spring中
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Autowired
private HandlerInterceptor permissionInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(permissionInterceptor)
.addPathPatterns("/**") // 攔截所有請(qǐng)求
.excludePathPatterns("/ignoreThis"); // 排除不需要攔截的請(qǐng)求
}
}然后你請(qǐng)求http://localhost:8080/user/1?auth=1
你會(huì)發(fā)現(xiàn)auth=1的時(shí)候攔截器放行
auth=0的時(shí)候會(huì)被攔截器攔截,并且拋出我們自定義的異常,然后自定義異常會(huì)被我們寫的異常處理器監(jiān)聽到,最終給客戶端返回沒(méi)有權(quán)限
到此這篇關(guān)于springMVC @RestControllerAdvice注解使用方式的文章就介紹到這了,更多相關(guān)springMVC @RestControllerAdvice注解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringMVC整合,出現(xiàn)注解沒(méi)有起作用的情況處理
- 如何使用Idea搭建全注解式開發(fā)的SpringMVC項(xiàng)目
- SpringMVC?@RequestMapping注解屬性詳細(xì)介紹
- SpringMVC中RequestBody注解的List參數(shù)傳遞方式
- SpringMVC @GetMapping注解路徑?jīng)_突問(wèn)題解決
- SpringMVC中RequestMapping注解(作用、出現(xiàn)的位置、屬性)
- 解決SpringMVC使用@RequestBody注解報(bào)400錯(cuò)誤的問(wèn)題
- SpringMVC注解@RequestParam方法原理解析
相關(guān)文章
Spring中@PropertySource注解使用場(chǎng)景解析
這篇文章主要介紹了Spring中@PropertySource注解使用場(chǎng)景解析,@PropertySource注解就是Spring中提供的一個(gè)可以加載配置文件的注解,并且可以將配置文件中的內(nèi)容存放到Spring的環(huán)境變量中,需要的朋友可以參考下2023-11-11
Spring的RedisTemplate存儲(chǔ)的key和value有特殊字符的處理
這篇文章主要介紹了Spring的RedisTemplate存儲(chǔ)的key和value有特殊字符的處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12
關(guān)于集合和字符串的互轉(zhuǎn)實(shí)現(xiàn)方法
下面小編就為大家?guī)?lái)一篇關(guān)于集合和字符串的互轉(zhuǎn)實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-08-08
spring aop action中驗(yàn)證用戶登錄狀態(tài)的實(shí)例代碼
本篇文章主要介紹了spring aop action中驗(yàn)證用戶登錄狀態(tài)的實(shí)例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07
RocketMq 消息重試機(jī)制及死信隊(duì)列詳解
這篇文章主要為大家介紹了RocketMq 消息重試機(jī)制及死信隊(duì)列詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10
Java無(wú)界阻塞隊(duì)列DelayQueue詳細(xì)解析
這篇文章主要介紹了Java無(wú)界阻塞隊(duì)列DelayQueue詳細(xì)解析,DelayQueue是一個(gè)支持時(shí)延獲取元素的無(wú)界阻塞隊(duì)列,隊(duì)列使用PriorityQueue來(lái)實(shí)現(xiàn),隊(duì)列中的元素必須實(shí)現(xiàn)Delayed接口,在創(chuàng)建元素時(shí)可以指定多久才能從隊(duì)列中獲取當(dāng)前元素,需要的朋友可以參考下2023-12-12

