日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

cloub spring 拦截器_Spring Cloud Gateway之全局异常拦截器

發(fā)布時間:2025/3/15 javascript 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 cloub spring 拦截器_Spring Cloud Gateway之全局异常拦截器 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

/**

* @version 2019/8/14

* @description: 異常攔截器

* @modified:

*/

@Slf4j

public class JsonExceptionHandler implements ErrorWebExceptionHandler {

/**

* MessageReader

*/

private List> messageReaders = Collections.emptyList();

/**

* MessageWriter

*/

private List> messageWriters = Collections.emptyList();

/**

* ViewResolvers

*/

private List viewResolvers = Collections.emptyList();

/**

* 存儲處理異常后的信息

*/

private ThreadLocal exceptionHandlerResult = new ThreadLocal<>();

/**

* 參考AbstractErrorWebExceptionHandler

*/

public void setMessageReaders(List> messageReaders) {

Assert.notNull(messageReaders, "'messageReaders' must not be null");

this.messageReaders = messageReaders;

}

/**

* 參考AbstractErrorWebExceptionHandler

*/

public void setViewResolvers(List viewResolvers) {

this.viewResolvers = viewResolvers;

}

/**

* 參考AbstractErrorWebExceptionHandler

*/

public void setMessageWriters(List> messageWriters) {

Assert.notNull(messageWriters, "'messageWriters' must not be null");

this.messageWriters = messageWriters;

}

@Override

public Mono handle(ServerWebExchange exchange, Throwable ex) {

// 按照異常類型進(jìn)行處理 默認(rèn)500

int httpStatus = HttpStatus.INTERNAL_SERVER_ERROR.value();

String body = "系統(tǒng)異常,請聯(lián)系管理員";

if (ex instanceof NotFoundException) {

httpStatus = HttpStatus.NOT_FOUND.value();

body = ex.getMessage();

}else if(ex instanceof ResponseStatusException){

ResponseStatusException responseStatusException = (ResponseStatusException) ex;

httpStatus = responseStatusException.getStatus().value();

body = responseStatusException.getMessage();

} else if (ex instanceof BusinessException) {

body = ex.getMessage();

httpStatus = ((BusinessException) ex).toResEntity().getHttpStatus();

} else if (ex instanceof RuntimeException) {

Throwable cause = ex.getCause();

body = ex.getMessage();

if(null != cause && cause.getMessage().contains("Load balancer does not have available server for client")){

body = "服務(wù)不存在";

}

}

//錯誤記錄

ServerHttpRequest request = exchange.getRequest();

log.error("[全局異常處理]異常請求路徑:{}", request.getPath());

log.error("異常詳細(xì)信息:{}",ex);

//封裝響應(yīng)體

ResEntity res = new ResEntity();

res.setHttpStatus(httpStatus);

res.setMsg(body);

//參考AbstractErrorWebExceptionHandler

if (exchange.getResponse().isCommitted()) {

return Mono.error(ex);

}

exceptionHandlerResult.set(res);

ServerRequest newRequest = ServerRequest.create(exchange, this.messageReaders);

return RouterFunctions.route(RequestPredicates.all(), this::renderErrorResponse).route(newRequest)

.switchIfEmpty(Mono.error(ex))

.flatMap((handler) -> handler.handle(newRequest))

.flatMap((response) -> write(exchange, response));

}

/**

* 參考DefaultErrorWebExceptionHandler

*/

protected Mono renderErrorResponse(ServerRequest request) {

ResEntity result = exceptionHandlerResult.get();

//404 因前端框架問題,不轉(zhuǎn)換處理 ,因此目前只有系統(tǒng)報500才轉(zhuǎn)換為自定義的狀態(tài)碼

if(HttpStatus.INTERNAL_SERVER_ERROR.value() == result.getHttpStatus()){

return ServerResponse.status(HttpStatus.OK.value())

.contentType(MediaType.APPLICATION_JSON_UTF8)

.body(BodyInserters.fromObject(result));

}

return ServerResponse.status(result.getHttpStatus())

.contentType(MediaType.APPLICATION_JSON_UTF8)

.body(BodyInserters.fromObject(result));

}

/**

* 參考AbstractErrorWebExceptionHandler

*/

private Mono extends Void> write(ServerWebExchange exchange,

ServerResponse response) {

exchange.getResponse().getHeaders()

.setContentType(response.headers().getContentType());

return response.writeTo(exchange, new ResponseContext());

}

/**

* 參考AbstractErrorWebExceptionHandler

*/

private class ResponseContext implements ServerResponse.Context {

@Override

public List> messageWriters() {

return JsonExceptionHandler.this.messageWriters;

}

@Override

public List viewResolvers() {

return JsonExceptionHandler.this.viewResolvers;

}

}

}

總結(jié)

以上是生活随笔為你收集整理的cloub spring 拦截器_Spring Cloud Gateway之全局异常拦截器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。