才開通博客沒幾天,不知道寫什麼東西,就把最近在項目中做的東西分享一下,開通博客也可以監督一下自己,技術的路很遙遠,希望能通過寫博客來讓自己走的更遠。 一般在web項目中都需要定義一個全局異常來處理一些業務方面的異常,下麵是自定義異常的一些代碼。 1.自定義一個異常,然後繼承RuntimeExcept ...
才開通博客沒幾天,不知道寫什麼東西,就把最近在項目中做的東西分享一下,開通博客也可以監督一下自己,技術的路很遙遠,希望能通過寫博客來讓自己走的更遠。
一般在web項目中都需要定義一個全局異常來處理一些業務方面的異常,下麵是自定義異常的一些代碼。
1.自定義一個異常,然後繼承RuntimeException
/**
* @author zhuwenwen
* @date 2018/8/16 20:18
*/
@Getter
public class CustomException extends RuntimeException {
/**
* 異常編碼
*/
private Integer code;
/**
* 附加數據
*/
private Object data;
public CustomException(String errorMsg) {
super(errorMsg);
this.code= CustomEnum.ERROR.getCode();
}
public CustomException(String errorMsg, Integer code) {
super(errorMsg);
this.code = code;
}
public CustomException(Integer code, String errorMsg, Throwable errorCourse) {
super(errorMsg,errorCourse);
this.code = code;
}
public CustomException(String message, Integer code, Object data) {
super(message);
this.code = code;
this.data = data;
}
}
2.定義一個全局異常處理的類
/**
* 處理全局異常
*
* @author zhuwenwen
* @date 2018/8/17 9:31
*/
@RestControllerAdvice
public class CustomExceptionHandler extends ResponseEntityExceptionHandler implements CustomExceptionHanlerTrit {
private Logger logger=LoggerFactory.getLogger(CustomExceptionHandler.class);
/**
*
* @see ResponseEntityExceptionHandler#handleExceptionInternal
*/
@Override
protected ResponseEntity<Object> handleExceptionInternal(Exception ex, Object body, HttpHeaders headers, HttpStatus status,WebRequest webRequest) {
logger.warn("{}", ex.getMessage());
return handleException(CustomEnum.FAILURE_HTTP.getCode() + status.value(), ex.getMessage(), null);
}
/**
* 處理ServletException
*
* @param ex 異常
* @return 異常處理結果
*/
@ExceptionHandler(value = {ServletException.class})
protected final ResponseEntity<Object> handleServletException(ServletException ex) {
logger.error("{}", ex);
return handleException(CustomEnum.FAILURE_SERVLET.getCode(), ex.getMessage(), null);
}
/**
* 處理SQLException
*
* @param ex 異常
* @return 異常處理結果
*/
@ExceptionHandler(value = {SQLException.class})
protected final ResponseEntity<Object> handleSQLException(SQLException ex) {
logger.error("{}", ex);
return handleException(CustomEnum.FAILURE_DB.getCode(), ex.getMessage(), null);
}
/**
* 處理ConstraintViolationException
*
* @param ex 異常
* @return 異常處理結果
*/
@ExceptionHandler(value = {ConstraintViolationException.class})
protected final ResponseEntity<Object> handleConstraintViolationException(ConstraintViolationException ex) {
logger.error("{}", ex);
String message = ex.getMessage();
if (ex.getConstraintViolations() != null && !ex.getConstraintViolations().isEmpty()) {
message = ex.getConstraintViolations().stream().findFirst().isPresent()
? ex.getConstraintViolations().stream().findFirst().get().getMessage() : null;
}
return handleException(CustomEnum.FAILURE_VALIDATION.getCode(), message, null);
}
/**
* 處理MorphedException
*
* @param ex 異常
* @return 異常處理結果
*/
@ExceptionHandler(value = {CustomException.class})
protected final ResponseEntity<Object> handleMorphedException(CustomException ex) {
logger.info("{}", ex);
return handleException(ex.getCode(), ex.getMessage(),ex.getData());
}
/**
* 處理RuntimeException
*
* @param ex 異常
* @return 異常處理結果
*/
@ExceptionHandler(value = {RuntimeException.class})
protected final ResponseEntity<Object> handleRuntimeException(RuntimeException ex) {
logger.error("{}", ex);
return handleException(CustomEnum.FAILURE_UNKNOWN.getCode(), ex.getMessage(), null);
}
}
3.封裝成一個組件,可以打成jar包,供多個項目使用,那麼可以自定義一個註解,然後在啟動類上加上這個註解,即可使用。下麵是一個簡單的demo
/**
* @author zhuwenwen
* @date 2018/8/17 11:02
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Import(CustomExceptionHandler.class)
@Documented
public @interface EnableCustomException {
/**
* 是否開啟
* @return
*/
boolean enabled() default true;
}
/**
* @author zhuwenwen
* @date 2018/8/17 14:47
*/
public class CustomImportBeanDefination implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) {
//是否含有@EnableCustomException註解
if (annotationMetadata.isAnnotated(EnableCustomException.class.getName())){
//獲取該註解上面的所有屬性,然後封裝成一個map
MultiValueMap<String, Object> attributes = annotationMetadata.getAllAnnotationAttributes(EnableCustomException.class.getName());
if(attributes.get(EnableCustomExceptionCode.ENABLED).equals(Boolean.TRUE)){
BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.rootBeanDefinition(CustomExceptionHandler.class);
beanDefinitionRegistry.registerBeanDefinition(CustomExceptionHandler.class.getName(),beanDefinitionBuilder.getBeanDefinition());
}
}
}
}