FeignClient服務(wù)器拋出異??蛻舳颂幚矸桨?/h1>
更新時間:2022年06月16日 09:40:48 作者:飄逝才子
這篇文章主要介紹了FeignClient服務(wù)器拋出異??蛻舳颂幚矸桨?,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
FeignClient服務(wù)器拋出異常客戶端處理
在使用feign進(jìn)行遠(yuǎn)程方法調(diào)用時,如果遠(yuǎn)程服務(wù)端方法出現(xiàn)異常,客戶端有時需要捕獲,并且把異常信息返回給前端,而如果在開啟熔斷之后,這個異常會被消化,所以說,如果希望拿到服務(wù)端異常,
feign.hystrix.enable需要設(shè)置為false,而當(dāng)不開熔斷時,我們也有幾種方法把拿到服務(wù)端的異常信息,下面總結(jié)一下。
feign異常攔截器
注冊一個Bean對象,當(dāng)feign調(diào)用出現(xiàn)異常的時候,會觸發(fā)這個方法:
import com.test.JsonUtils;
import feign.Response;
import feign.Util;
import feign.codec.ErrorDecoder;
import io.test.BadRequestException;
import io.test.InternalServerErrorException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Configuration;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import static feign.FeignException.errorStatus;
/**
* @author 飄逝才子
* @date 2020/11/05
* @description
*/
@Configuration
public class FeignClientErrorDecoder implements ErrorDecoder {
private Logger logger = LoggerFactory.getLogger(FeignClientErrorDecoder.class);
@Override
public Exception decode(String methodKey, Response response) {
Map<String, Object> jsonBody = new HashMap<>();
jsonBody.put("message", "Internal server error");
try {
String body = Util.toString(response.body().asReader());
jsonBody = JsonUtils.toMap(body);
} catch (IOException e) {
logger.error("feign.IOException", e);
}
assert jsonBody != null;
if (response.status() >= 400 && response.status() < 500) {
throw new BadRequestException(jsonBody.get("message").toString());
}
if (response.status() >= 500) {
throw new InternalServerErrorException(jsonBody.get("message").toString());
}
return errorStatus(methodKey, response);
}
}
注意,使用這個方式,需要在熔斷器關(guān)閉時才起作用,因?yàn)樗鼈兊膱?zhí)行過程是,先走這個攔截器,再走熔斷的fallback,所以這個異常會被熔斷吞掉,返回狀態(tài)為200,返回值為你的fallback的默認(rèn)值。
FeignClient異常合集Mark
問題1
feignClient調(diào)用報(bào)異常cause:Content-Type cannot contain wildcard type ‘*’
是因?yàn)檫h(yuǎn)程調(diào)用的時候入?yún)⒆R別不了application/json
解決辦法:在方法上加上類型即可consumes = MediaType.APPLICATION_JSON_VALUE
@RequestMapping(value = "/xxx/xxx/xxx/xxx/xxx/xxx/result",method = RequestMethod.GET, consumes = MediaType.APPLICATION_JSON_VALUE)
ResponseResult xxx(TaskParam taskParam);
問題2
fallback 與fallbackFactory的使用
fallbackFactory:拋出異常可查看,一般看里面拋出的異常日志即可判斷遠(yuǎn)程調(diào)用的問題所在。


以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
-
解決java.net.SocketTimeoutException: Read timed out的問題
這篇文章主要介紹了解決java.net.SocketTimeoutException: Read timed out的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教 2021-06-06
-
vscode 配置java環(huán)境并調(diào)試運(yùn)行的詳細(xì)過程
這篇文章主要介紹了vscode 配置java環(huán)境并調(diào)試運(yùn)行的詳細(xì)過程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下 2021-05-05
最新評論
FeignClient服務(wù)器拋出異常客戶端處理
在使用feign進(jìn)行遠(yuǎn)程方法調(diào)用時,如果遠(yuǎn)程服務(wù)端方法出現(xiàn)異常,客戶端有時需要捕獲,并且把異常信息返回給前端,而如果在開啟熔斷之后,這個異常會被消化,所以說,如果希望拿到服務(wù)端異常,
feign.hystrix.enable需要設(shè)置為false,而當(dāng)不開熔斷時,我們也有幾種方法把拿到服務(wù)端的異常信息,下面總結(jié)一下。
feign異常攔截器
注冊一個Bean對象,當(dāng)feign調(diào)用出現(xiàn)異常的時候,會觸發(fā)這個方法:
import com.test.JsonUtils;
import feign.Response;
import feign.Util;
import feign.codec.ErrorDecoder;
import io.test.BadRequestException;
import io.test.InternalServerErrorException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Configuration;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import static feign.FeignException.errorStatus;
/**
* @author 飄逝才子
* @date 2020/11/05
* @description
*/
@Configuration
public class FeignClientErrorDecoder implements ErrorDecoder {
private Logger logger = LoggerFactory.getLogger(FeignClientErrorDecoder.class);
@Override
public Exception decode(String methodKey, Response response) {
Map<String, Object> jsonBody = new HashMap<>();
jsonBody.put("message", "Internal server error");
try {
String body = Util.toString(response.body().asReader());
jsonBody = JsonUtils.toMap(body);
} catch (IOException e) {
logger.error("feign.IOException", e);
}
assert jsonBody != null;
if (response.status() >= 400 && response.status() < 500) {
throw new BadRequestException(jsonBody.get("message").toString());
}
if (response.status() >= 500) {
throw new InternalServerErrorException(jsonBody.get("message").toString());
}
return errorStatus(methodKey, response);
}
}
注意,使用這個方式,需要在熔斷器關(guān)閉時才起作用,因?yàn)樗鼈兊膱?zhí)行過程是,先走這個攔截器,再走熔斷的fallback,所以這個異常會被熔斷吞掉,返回狀態(tài)為200,返回值為你的fallback的默認(rèn)值。
FeignClient異常合集Mark
問題1
feignClient調(diào)用報(bào)異常cause:Content-Type cannot contain wildcard type ‘*’
是因?yàn)檫h(yuǎn)程調(diào)用的時候入?yún)⒆R別不了application/json
解決辦法:在方法上加上類型即可consumes = MediaType.APPLICATION_JSON_VALUE
@RequestMapping(value = "/xxx/xxx/xxx/xxx/xxx/xxx/result",method = RequestMethod.GET, consumes = MediaType.APPLICATION_JSON_VALUE)
ResponseResult xxx(TaskParam taskParam);
問題2
fallback 與fallbackFactory的使用
fallbackFactory:拋出異常可查看,一般看里面拋出的異常日志即可判斷遠(yuǎn)程調(diào)用的問題所在。


以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
解決java.net.SocketTimeoutException: Read timed out的問題
這篇文章主要介紹了解決java.net.SocketTimeoutException: Read timed out的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06
vscode 配置java環(huán)境并調(diào)試運(yùn)行的詳細(xì)過程
這篇文章主要介紹了vscode 配置java環(huán)境并調(diào)試運(yùn)行的詳細(xì)過程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-05-05

