SpringCloudFeign 전역 이상 처리
21848 단어 SpringBootJava자바springboot
서버 에서 전역 차단 이상 통일 처리 (@ RestController Advice) 를 사용 하여 통 일 된 형식 정 보 를 되 돌려 feign 클 라 이언 트 가 서버 를 호출 할 때 서버 에 이상 이 발생 하면 클 라 이언 트 가 이상 을 포착 하지 못 하고 녹 아내 림, 강등 에 들 어가 지 못 합 니 다.
@Slf4j
@RestControllerAdvice
public class ExceptionHandle {
@ExceptionHandler(Exception.class)
private Result handle(Exception exception) {
return null;
}
}
해결 방법: @ RestController Advice 주석 에서 이상 패 키 지 를 통일 적 으로 차단 해 야 하 며, feign 호출 패 키 지 는 포함 되 지 않 습 니 다.
@Slf4j
@RestControllerAdvice({"com.test.controller"})
//@RestControllerAdvice
public class ExceptionHandle {
}
구덩이 2: feign 이 녹 아내 린 후 서비스 제공 자가 던 진 원본 이상 정 보 를 얻 지 못 합 니 다.
이상 정보 예:
WxServiceApi#getTokenByAppId(String) failed and no fallback available.;
예상 목표: 원본 이상 정 보 를 가 져 와 해결 방법 1: 닫 기
feign:
hystrix:
enabled: false
해결 방법 2: ErrorDecoder 를 실현 합 니 다. 사용자 정의 ErrorDecoder ErrorDecoder 를 사용 하면 전역 을 설정 할 수도 있 고 @ FeignClient 에서 전역 을 지정 할 수도 있 습 니 다. 녹 아내 리 지 않 습 니 다.
@Slf4j
@Configuration
public class ExceptionErrorDecoder implements ErrorDecoder {
@Override
public Exception decode(String var1, Response response) {
try {
if (response.body() != null) {
String body = Util.toString(response.body().asReader());
log.error(body);
ExceptionInfo exceptionInfo = JSON.parseObject(body, new TypeReference<ExceptionInfo>() {
});
// Class clazz = Class.forName(exceptionInfo.getException());
//Exception exception = (Exception) clazz.getDeclaredConstructor(String.class).newInstance(exceptionInfo.getMessage());
return new HystrixBadRequestException(exceptionInfo.getMessage());
//return exception;
}
} catch (Exception var4) {
log.error(var4.getMessage());
return new InternalException(var4.getMessage());
}
return new InternalException("system error");
}
}
ExceptionInfo 클래스
@Data
public class ExceptionInfo {
private Long timestamp;
private Integer status;
private String exception;
private String message;
private String path;
private String error;
}
단일 @ FeignClient 에서 지정 한 녹 아내 림:
public class KeepErrMsgConfiguration {
@Bean
public ErrorDecoder errorDecoder() {
return new UserErrorDecoder();
}
/**
*
*/
public class UserErrorDecoder implements ErrorDecoder {
private Logger logger = LoggerFactory.getLogger(getClass());
@Override
public Exception decode(String methodKey, Response response) {
Exception exception = null;
try {
//
String json = Util.toString(response.body().asReader());
exception = new RuntimeException(json);
// Result,
Result result = JSONObject.parseObject(json, Result.class);
// RuntimeException,
if (!ResultUtil.isSuccess(result)) {
exception = new RuntimeException(result.getObj().toString());
}
} catch (IOException ex) {
logger.error(ex.getMessage(), ex);
}
return exception;
}
}
}
녹 아내 림 에 들 어가 지 않 음:
public class NotBreakerConfiguration {
@Bean
public ErrorDecoder errorDecoder() {
return new UserErrorDecoder();
}
/**
*
*/
public class UserErrorDecoder implements ErrorDecoder {
private Logger logger = LoggerFactory.getLogger(getClass());
@Override
public Exception decode(String methodKey, Response response) {
Exception exception = null;
try {
String json = Util.toString(response.body().asReader());
exception = new RuntimeException(json);
// Result,
Result result = JSONObject.parseObject(json, Result.class);
// RuntimeException,
if (!ResultUtil.isSuccess(result)) {
exception = new HystrixBadRequestException(result.getObj().toString());
}
} catch (IOException ex) {
logger.error(ex.getMessage(), ex);
}
return exception;
}
}
}
@ FeignClient 주석 설정
@FeignClient(name = "wx-service",url ="http://localhost:8082", fallbackFactory = WxHystrixClientFallbackFactory.class, configuration = NotBreakerConfiguration.class)
@Component
interface WxServiceApi {
}
자신의 프로젝트 에 따라 필요 한 errorDecoder 설정 을 실현 하고 유연 하 게 사용 합 니 다.
참고:
https://blog.csdn.net/hnhygkx/article/details/89492031
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【Java・SpringBoot・Thymeleaf】 에러 메세지를 구현(SpringBoot 어플리케이션 실천편 3)로그인하여 사용자 목록을 표시하는 응용 프로그램을 만들고, Spring에서의 개발에 대해 공부하겠습니다 🌟 마지막 데이터 바인딩에 계속 바인딩 실패 시 오류 메시지를 구현합니다. 마지막 기사🌟 src/main/res...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.