import java.io.IOException;
import java.lang.reflect.Type;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import feign.Response;
import feign.Util;
import feign.codec.DecodeException;
import feign.codec.Decoder;
public class FeignResultDecoder implements Decoder{
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Override
public Object decode(Response paramResponse, Type paramType) throws IOException{
if(paramResponse.body() == null) {
throw new DecodeException(paramResponse.status(), "没有返回数据", paramResponse.request());
}
try {
String res = Util.toString(paramResponse.body().asReader(Util.UTF_8));
logger.info("result :"+res);
return res;
} catch (Exception e) {
throw new IOException("无法解码返回报文",e);
}
}
}
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.kayak.exception.ErrorException;
import feign.Response;
import feign.Util;
import feign.codec.DecodeException;
import feign.codec.ErrorDecoder;
public class FeignErrorDecoder implements ErrorDecoder{
private final Logger logger = LoggerFactory.getLogger(this.getClass());
String result = "远程调用出现异常";
@Override
public Exception decode(String paramString, Response paramResponse) {
logger.info("erorStatus:"+paramResponse.status());
if(paramResponse.body() == null) {
throw new DecodeException(paramResponse.status(), "没有返回数据", paramResponse.request());
}
try {
result = Util.toString(paramResponse.body().asReader(Util.UTF_8));
logger.info("异常result:"+result);
return new ErrorException(paramResponse.status()+"", result);
} catch (Exception e) {
return new ErrorException("999"+"", result);
}
}
}
@Configuration
public class FeignClientConfiguration{
@Bean
public Logger.Level feignLogLevel(){
// 配置日志级别
return Logger.Level.FULL;
}
@Bean
public Decoder feignDefDecoder() {
return new FeignResultDecoder();
}
@Bean
public ErrorDecoder feignErrorDecoder() {
return new FeignErrorDecoder();
}
}
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Component;
import lombok.Data;
@RefreshScope ###更新nacos配置自动刷新
@Component
@Data
public class NacosConfig {
@Value(value="${weixin.wechatMchId}")
private String wechatMchId;
@Value(value="${weixin.appid}")
private String appid;
}
###方式一 实现feignClient接口 ###直接抛出自定义异常
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import com.kayak.common.base.entity.BaseRequest;
import com.kayak.integration.client.UserInfoFeignClient;
import com.kayak.message.domain.base.UserInfoRequest;
@Component
public class UserInfoFeignClientFallBack implements UserInfoFeignClient{
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Override
public String getUserInfo(BaseRequest<UserInfoRequest> baserequest) {
logger.info("远程调用出现异常");
return "远程调用出现异常";
}
}
###方式二 实现FallbackFactory接口 ###捕捉原定义异常信息
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import com.kayak.integration.client.WxSendFeignClient;
import com.kayak.message.domain.base.CouponsRequest;
import feign.hystrix.FallbackFactory;
@Component
public class WxSendFeignClientFallBack implements FallbackFactory<WxSendFeignClient>{
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Override
public WxSendFeignClient create(Throwable error) {
return new WxSendFeignClient() {
@Override
public String queryCoupon(String openId, String coupon_id, String token, String appid) {
String errStr = error.getMessage();
logger.info("远程调用出现异常,error:"+errStr);
return errStr;
}
@Override
public String getCoupons(CouponsRequest couponsRequest, String openId, String token) {
String errStr = error.getMessage();
return errStr;
}
};
}
}