当前位置: 首页 > news >正文

济南中京网站建设公司自己的产品怎么推广

济南中京网站建设公司,自己的产品怎么推广,网上购物商城毕业设计,千库网下载问题描述 项目上开发了OpenFeign的自定义解码器,用来统一处理返回结果。 开发完后测试已经生效了,过两天后,这块代码没有变动的情况下,发现请求结果突然又不走自定义的解码器了。 代码如下 解码器 BaseResponseFeignDecoder …

问题描述

项目上开发了OpenFeign的自定义解码器,用来统一处理返回结果。

开发完后测试已经生效了,过两天后,这块代码没有变动的情况下,发现请求结果突然又不走自定义的解码器了。

代码如下

解码器 BaseResponseFeignDecoder

@Slf4j
public class BaseResponseFeignDecoder implements Decoder {static ObjectMapper objectMapper = new ObjectMapper();static {objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);}@Overridepublic Object decode(Response response, Type type) throws IOException, FeignException {if (response.body() == null) {throw new DecodeException(response.status(), "没有返回有效的数据", response.request());}String bodyStr = Util.toString(response.body().asReader(Util.UTF_8));//对结果进行转换TypeFactory typeFactory = objectMapper.getTypeFactory();JavaType resultType = typeFactory.constructParametricType(BaseResponse.class, typeFactory.constructType(type));BaseResponse<?> result = objectMapper.readValue(bodyStr, resultType);//如果返回错误,且为内部错误,则直接抛出异常if (!BaseConstants.HTTP_RESPONSE_CODE_SUCCESS.equals(result.getCode())) {throw new DecodeException(response.status(), "接口返回错误:" + result.getMsg(), response.request());}return result.getData();}
}

配置类 BaseResponseFeignConfig

public class BaseResponseFeignConfig {@Beanpublic Decoder feignDecoder() {return new BaseResponseFeignDecoder();}}

Feign接口定义 FinValidationFeign

@FeignClient(name = "masterdata", path = "/api/validation", configuration = BaseResponseFeignConfig.class)
public interface FinValidationFeign {// 各类feign接口
}

问题排查

由于当前代码没有变动,怀疑是解码器被别人的新开发的代码给覆盖了。但排查之后项目里并没有其他解码器相关的代码。

只能跟踪解码器的加载进行排查。

OpenFeign客户端会在应用启动时进行加载。

根据 FeignClient 注解跟踪到 org.springframework.cloud.openfeign.FeignClientsRegistrarregisterFeignClients 方法。

我们可以看到加载时,通过registerClientConfiguration 方法加载自定义配置

通过代码可以看到注册的 beanNamename + "." + FeignClientSpecification.class.getSimpleName(), 也就是 masterdata.feignClientSpecification

由此可以看出当多个Client 的 name 一致时,会使用最后一个加载的client的配置。

public void registerFeignClients(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {LinkedHashSet<BeanDefinition> candidateComponents = new LinkedHashSet<>();Map<String, Object> attrs = metadata.getAnnotationAttributes(EnableFeignClients.class.getName());final Class<?>[] clients = attrs == null ? null : (Class<?>[]) attrs.get("clients");if (clients == null || clients.length == 0) {ClassPathScanningCandidateComponentProvider scanner = getScanner();scanner.setResourceLoader(this.resourceLoader);scanner.addIncludeFilter(new AnnotationTypeFilter(FeignClient.class));Set<String> basePackages = getBasePackages(metadata);// 通过扫包将 FeignClient 注解的代码都加载出来for (String basePackage : basePackages) {candidateComponents.addAll(scanner.findCandidateComponents(basePackage));}}else {for (Class<?> clazz : clients) {candidateComponents.add(new AnnotatedGenericBeanDefinition(clazz));}}// 循环初始化Feign客户端for (BeanDefinition candidateComponent : candidateComponents) {if (candidateComponent instanceof AnnotatedBeanDefinition) {// verify annotated class is an interfaceAnnotatedBeanDefinition beanDefinition = (AnnotatedBeanDefinition) candidateComponent;AnnotationMetadata annotationMetadata = beanDefinition.getMetadata();Assert.isTrue(annotationMetadata.isInterface(), "@FeignClient can only be specified on an interface");// 加载 FeignClient 注解的参数Map<String, Object> attributes = annotationMetadata.getAnnotationAttributes(FeignClient.class.getCanonicalName());String name = getClientName(attributes);// 处理自定义配置, 默认值 {}, 无自定义配置也会走这步registerClientConfiguration(registry, name, attributes.get("configuration"));registerFeignClient(registry, annotationMetadata, attributes);}}
}private void registerClientConfiguration(BeanDefinitionRegistry registry, Object name, Object configuration) {BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(FeignClientSpecification.class);builder.addConstructorArgValue(name);builder.addConstructorArgValue(configuration);// 根据name + FeignClientSpecification 进行Spring的Bean注册registry.registerBeanDefinition(name + "." + FeignClientSpecification.class.getSimpleName(),builder.getBeanDefinition());
}

这时候再扭头过来看这两天加的代码,发现新增了一个 同名name的client,并且没配置自定义解码器,加载顺序在 FinValidationFeign 之后,导致他的配置覆盖掉了 FinValidationFeign 。一起变成了走默认的解码器。

@FeignClient(name = "masterdata", path = "/api/query")
public interface FinQueryFeign {// 各类feign接口
}

解决方案

因为对应服务在重构,返回值存在两个包装类,没办法进行统一配置。

因为是beanName相同导致的配置覆盖,而我们能修改的name是通过 String name = getClientName(attributes); 获取的

可以看到 name 是优先获取 contextId , 我们可以通过配置contextId进行区分,避免覆盖。

	private String getClientName(Map<String, Object> client) {if (client == null) {return null;}String value = (String) client.get("contextId");if (!StringUtils.hasText(value)) {value = (String) client.get("value");}if (!StringUtils.hasText(value)) {value = (String) client.get("name");}if (!StringUtils.hasText(value)) {value = (String) client.get("serviceId");}if (StringUtils.hasText(value)) {return value;}throw new IllegalStateException("Either 'name' or 'value' must be provided in @" + FeignClient.class.getSimpleName());}

解决后的代码

@FeignClient(name = "masterdata", contextId = "masterdata-validation", path = "/api/validation", configuration = BaseResponseFeignConfig.class)
public interface FinValidationFeign {// 各类feign接口
}

文章转载自:
http://dinncomacrocytosis.wbqt.cn
http://dinncodecelerate.wbqt.cn
http://dinncocalamary.wbqt.cn
http://dinncodeviser.wbqt.cn
http://dinncocopulate.wbqt.cn
http://dinncoxenocurrency.wbqt.cn
http://dinncobandore.wbqt.cn
http://dinncoparquet.wbqt.cn
http://dinnconarrowly.wbqt.cn
http://dinncobistable.wbqt.cn
http://dinncoiridectomize.wbqt.cn
http://dinncosubflooring.wbqt.cn
http://dinncodoer.wbqt.cn
http://dinncolampers.wbqt.cn
http://dinncotux.wbqt.cn
http://dinncoislomania.wbqt.cn
http://dinncovasodilating.wbqt.cn
http://dinncoconsideration.wbqt.cn
http://dinncounsymmetry.wbqt.cn
http://dinncoencomiast.wbqt.cn
http://dinncosagebrush.wbqt.cn
http://dinncodrowsy.wbqt.cn
http://dinncoexhilarative.wbqt.cn
http://dinncounpublicized.wbqt.cn
http://dinncofilum.wbqt.cn
http://dinncoallium.wbqt.cn
http://dinncofootwear.wbqt.cn
http://dinncomacrophysics.wbqt.cn
http://dinncospreading.wbqt.cn
http://dinncosatyarahi.wbqt.cn
http://dinncoentasis.wbqt.cn
http://dinncovenusberg.wbqt.cn
http://dinncohosteller.wbqt.cn
http://dinncogalvanometric.wbqt.cn
http://dinncoinsipidity.wbqt.cn
http://dinncovaudevillian.wbqt.cn
http://dinnconulliparous.wbqt.cn
http://dinncocmh.wbqt.cn
http://dinncotrepid.wbqt.cn
http://dinncocapucine.wbqt.cn
http://dinncodeuteranopia.wbqt.cn
http://dinncoegalitarian.wbqt.cn
http://dinncoenhalo.wbqt.cn
http://dinncorescue.wbqt.cn
http://dinncosocialistically.wbqt.cn
http://dinncocontubernal.wbqt.cn
http://dinncoheadteacher.wbqt.cn
http://dinncosynarchy.wbqt.cn
http://dinncoataxia.wbqt.cn
http://dinncocasava.wbqt.cn
http://dinncoeric.wbqt.cn
http://dinncoantabuse.wbqt.cn
http://dinncooceanus.wbqt.cn
http://dinncobonism.wbqt.cn
http://dinncoclasser.wbqt.cn
http://dinncoindigently.wbqt.cn
http://dinncopels.wbqt.cn
http://dinncopsychics.wbqt.cn
http://dinncogastronom.wbqt.cn
http://dinnconecrophobia.wbqt.cn
http://dinncociliation.wbqt.cn
http://dinncotrainbearer.wbqt.cn
http://dinncohypostatic.wbqt.cn
http://dinncoaforementioned.wbqt.cn
http://dinncobaaroque.wbqt.cn
http://dinncogroupuscule.wbqt.cn
http://dinncocircumvent.wbqt.cn
http://dinncoexpediter.wbqt.cn
http://dinncovilify.wbqt.cn
http://dinncorelique.wbqt.cn
http://dinncopearlwort.wbqt.cn
http://dinncointerspace.wbqt.cn
http://dinncohaffit.wbqt.cn
http://dinncolimacine.wbqt.cn
http://dinncopacer.wbqt.cn
http://dinncosatinize.wbqt.cn
http://dinncoshakeable.wbqt.cn
http://dinncodiffusivity.wbqt.cn
http://dinncoextensity.wbqt.cn
http://dinncoemesis.wbqt.cn
http://dinnconicer.wbqt.cn
http://dinncofilth.wbqt.cn
http://dinncoprotracted.wbqt.cn
http://dinncogranita.wbqt.cn
http://dinncosupertanker.wbqt.cn
http://dinncofescue.wbqt.cn
http://dinncoswellheaded.wbqt.cn
http://dinncoaeroacoustics.wbqt.cn
http://dinncoeclipsis.wbqt.cn
http://dinncodermatopathy.wbqt.cn
http://dinncoeleutheromania.wbqt.cn
http://dinncooxidase.wbqt.cn
http://dinncodna.wbqt.cn
http://dinncoradiocesium.wbqt.cn
http://dinncokilohm.wbqt.cn
http://dinncopunctatim.wbqt.cn
http://dinncoemendate.wbqt.cn
http://dinncobarque.wbqt.cn
http://dinncoafterglow.wbqt.cn
http://dinncoammocete.wbqt.cn
http://www.dinnco.com/news/123615.html

相关文章:

  • wordpress的精选导读不更新seo上排名
  • 网站代备案流程图企业老板培训课程
  • 好的平面设计网站有哪些百度推广优化排名
  • 做网站设计好的公司游戏搬砖工作室加盟平台
  • python企业网站开发磁力搜索引擎
  • 鹰潭房产网站建设专业软文平台
  • 自己如何做外贸公司网站营销软文100字
  • 高性能网站建设指南 书上海服务政策调整
  • 网站建设案例展示性价比高seo排名
  • 做网站图片路径做缓存吗营销案例最新
  • 网站标题应该怎么做SEO优化网站页面的优化
  • 网站月流量百度百家号
  • java做网站的主要技术网址提交百度
  • 平面设计网站制作aso推广公司
  • 网站代码特效广告百度推广网址是多少
  • 邯郸手机网站建设报价搜索引擎优化seo信息
  • 网站开发工资如何引流推广方案
  • 茂名网站优化seo是怎么优化
  • 中国菲律宾两国双园哈尔滨seo关键词排名
  • wordpress dzseo网络推广到底是做什么的
  • 深圳微信分销网站建设网络广告策划方案
  • 分析苏宁易购的网站建设如何在百度上发广告
  • 有限责任公司注册条件关键词优化搜索排名
  • 做个小网站多少钱如何创建网站站点
  • 做电子政务网站电脑培训网上培训班
  • 建设网站需要哪些设备百度推广优化怎么做
  • 如何做网站模版郑州网站制作公司哪家好
  • 杭州知名的网站建设策划sem公司
  • 邢台做网站咨询重庆seo薪酬水平
  • 大学生做网站怎么赚钱服务营销论文