在构建springboot多模块项目中,我们可能需要构建统一的异常处理;方便代码解耦、给出正确的提示。
于是,统一在controller中进行抛出,使用注解ControllerAdvice进行统一捕获(aop相关技术)。
下面给出案例:
1、在service中的抛出异常统一在controller进行相关处理
@RestController @RequestMapping("/item") public class ItemController { @PostMapping("/save") public ResponseEntity saveItem(Item item) { if (item.getPrivace() == null) { throw new LyException(ExceptionEnum.PRICE_CANNOT_BE_NULL); } item.setId(new Random().nextInt(100)); return ResponseEntity.status(HttpStatus.CREATED).body(item); }
2、定义切面进行异常处理(放在能扫面到的位置)
package com.leyou.common.advice; import com.leyou.common.enums.ExceptionEnum; import com.leyou.common.exception.LyException; import com.leyou.common.vo.ExceptionResult; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; /** * 异常处理 * 使用注解ControllerAdvice表明为异常处理的切面 * @ExceptionHandler(LyException.class)指明具体处理的异常 * * * @author admin */ @ControllerAdvice public class CommonExceptionHandler { Logger logger = LoggerFactory.getLogger(CommonExceptionHandler.class); @ExceptionHandler(LyException.class) public ResponseEntity<ExceptionResult> handleException(LyException e) { ExceptionEnum exceptionEnum = e.getExceptionEnum(); return ResponseEntity.status(exceptionEnum.getCode()).body(new ExceptionResult(exceptionEnum)); } }
3、通过枚举类型
package com.leyou.common.enums; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; /** * @author admin */ @AllArgsConstructor @NoArgsConstructor @Getter public enum ExceptionEnum { /** * 传递错误参数返回提示 */ PRICE_CANNOT_BE_NULL(400, "价格不能为空"), PRICE_CANNOT_BE_NULL(500, "服务器错误"), ; private int code; private String msg; }
4、返回的对象结果
package com.leyou.common.vo; import com.leyou.common.enums.ExceptionEnum; import lombok.Data; @Data public class ExceptionResult { private int status; private String message; private long timestamp; public ExceptionResult(ExceptionEnum e) { this.status = e.getCode(); this.message = e.getMsg(); this.timestamp = System.currentTimeMillis(); } }