全局捕獲異常
- 現(xiàn)在不管是什么項目,為了項目質(zhì)量和便于維護嘿期,都會加入異常捕獲,而Spring Boot 捕獲異常更為簡單埋合,不廢話,上代碼萄传。
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(RuntimeException.class)
@ResponseBody
public Map<String, Object> exceptionHandler() {
Map<String, Object> map = new HashMap<String, Object>();
map.put("errorCode", "500");
map.put("errorMsg", "系統(tǒng)錯誤!");
return map;
}
}
- 加入一個這樣的類甚颂,即可捕獲運行時的所有異常,如果需要做異常執(zhí)行更多操作秀菱,可以在里面加入日志的操作振诬。
-
@ExceptionHandler(RuntimeException.class)
表示攔截異常 -
@ControllerAdvice
是Controller的一個輔助類,最常用的就是作為全局異常的切面類 -
@ControllerAdvice
可以指定掃描范圍 -
@ControllerAdvice
約定了幾種可行的返回值衍菱。如果是直接返回model類的話赶么,需要使用@ResponseBody
進行JSON
轉(zhuǎn)換。 - 返回
String
的話脊串,意思就是表示跳轉(zhuǎn)的某個視圖辫呻。
AOP統(tǒng)一處理Web請求日志
要在Spring boot 中使用AOP清钥,要先引入依賴。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
廢話不多說放闺,看代碼
@Aspect
@Component
public class WebLogAspect {
private static final Logger logger = LoggerFactory.getLogger(WebLogAspect.class);
@Pointcut("execution(public * com.example.controller.*.*(..))")
public void webLog() {
}
@Before("webLog()")
public void doBefore(JoinPoint joinPoint) throws Throwable {
// 接收到請求祟昭,記錄請求內(nèi)容
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
// 記錄下請求內(nèi)容
logger.info("URL : " + request.getRequestURL().toString());
logger.info("HTTP_METHOD : " + request.getMethod());
logger.info("IP : " + request.getRemoteAddr());
Enumeration<String> enu = request.getParameterNames();
while (enu.hasMoreElements()) {
String name = (String) enu.nextElement();
logger.info("name:{},value:{}", name, request.getParameter(name));
}
}
@AfterReturning(returning = "ret", pointcut = "webLog()")
public void doAfterReturning(Object ret) throws Throwable {
// 處理完請求,返回內(nèi)容
logger.info("RESPONSE : " + ret);
}
}
這樣的處理怖侦,可以記錄下每個請求的路徑篡悟,每個請求設(shè)備的IP,每個請求的參數(shù)匾寝,以及返回結(jié)果搬葬,都會被日志打印出來,如果不想打印艳悔,想存到MongoDB或者Redis或其他上面 急凰,都是可以的。
SpringBoot使用Lombok做更多事情
先引入jar包
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
大部分使用Lombok的哥們很钓,其實都是在實體類上面貼注解香府,生產(chǎn)set/get方法,lombok底層就是使用ASM字節(jié)碼技術(shù)码倦,生成set/get方法企孩。(PS:spring boot 對 lombok 有很大的支持,如果要使用Lombok插件袁稽,不管是eclipse還是Idea都要先對IDE安裝插件)
- 下面對Lombok常用注解做個總結(jié)
@Data 標(biāo)簽勿璃,生成getter/setter toString()等方法
@NonNull : 讓你不在擔(dān)憂并且愛上NullPointerException
@CleanUp : 自動資源管理:不用再在finally中添加資源的close方法
@Setter/@Getter : 自動生成set和get方法
@ToString : 自動生成toString方法
@EqualsAndHashcode : 從對象的字段中生成hashCode和equals的實現(xiàn)
@NoArgsConstructor/@RequiredArgsConstructor/@AllArgsConstructor
自動生成構(gòu)造方法
@Data : 自動生成set/get方法,toString方法推汽,equals方法补疑,hashCode方法,不帶參數(shù)的構(gòu)造方法
@Value : 用于注解final類
@Builder : 產(chǎn)生復(fù)雜的構(gòu)建器api類
@SneakyThrows : 異常處理(謹(jǐn)慎使用)
@Synchronized : 同步方法安全的轉(zhuǎn)化
@Getter(lazy=true) :
@Log : 支持各種logger對象歹撒,使用時用對應(yīng)的注解莲组,如:@Log4
ps:在spring boot 中,我個人推薦使用 SLF4J記錄日志暖夭,直接在類上面貼個`@Slf4j`就可以了
@Async 異步執(zhí)行方法
如果要使用這個锹杈,就要在啟動類上添加@EnableAsync
,表示開啟異步執(zhí)行迈着,在需要執(zhí)行的異步方法上加入
@Async
就可以竭望,在方法添加了@Async
之后,底層使用的還是多線程技術(shù)裕菠,也就是新開一個線程去調(diào)用這個加了注解的方法咬清。