feign的启动异常:The bean 'XXX.FeignClientSpecification', defined in null, could not be registere

版本使用的是SpringBoot: 2.1.5.RELEASE,SpringCloud: Greenwich.SR1,OpenFeign: 2.1.1.RELEASE

Description:

The bean 'produce-core.FeignClientSpecification', defined in null, could not be registered. A bean with that name has already been defined in null and overriding is disabled.

Action:

Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true

于是按照提示,设置为true,虽然可以启动,但是继续追根溯源。在项目的服务中对外提供了两个feign接口,当出现了多个服务名称的时候 就会报错。在启动类上可以看到:@EnableFeignClients这个注解。

feign的启动异常:The bean 'XXX.FeignClientSpecification', defined in null, could not be registere_第1张图片
可以看到FeignClientsRegistrar这个类,进去之后,可看到 方法

public void registerFeignClients(AnnotationMetadata metadata,
			BeanDefinitionRegistry registry) 

而后可以看到
feign的启动异常:The bean 'XXX.FeignClientSpecification', defined in null, could not be registere_第2张图片
此代码可知:在注册配置client的时候,传入name,获取name的时候通过getClientName()方法

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());
	}

这个时候的name为feignClient的name,或者value,或者contextId
通过注释: This will be used as the bean name instead of name if present, but will not be used as a service id.也就是作为bean的名称会代替name(也是value,因为name和value为别名作用)
这个name在方法中和类名的简单名称进行拼接,注入到Ioc的是相同Bean名。
因为我们的value为微服务的名称。

private void registerClientConfiguration(BeanDefinitionRegistry registry, Object name,
			Object configuration) {
     
		BeanDefinitionBuilder builder = BeanDefinitionBuilder
				.genericBeanDefinition(FeignClientSpecification.class);
		builder.addConstructorArgValue(name);
		builder.addConstructorArgValue(configuration);
		registry.registerBeanDefinition(
				name + "." + FeignClientSpecification.class.getSimpleName(),
				builder.getBeanDefinition());
	}

所以,综上可知,只需要将contextId进行别名设计即可。
@FeignClient(value = “produce-core”, contextId = “userClient”)
@FeignClient(value = “produce-core”, contextId = “personClient”)
这个时候即便是不配置 allow-bean-definition-overriding: true
启动也是可以的

你可能感兴趣的:(记录,java)