在使用Feign过程中,遇到一个让人特别摸不到头脑的问题,启动服务时,系统报错:
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.kes.cybereng.check.common.client.DictionaryClient': FactoryBean threw exception on object creation; nested exception is java.lang.NullPointerException
at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:178) ~[spring-beans-5.1.10.RELEASE.jar:5.1.10.RELEASE]
at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getObjectFromFactoryBean(FactoryBeanRegistrySupport.java:101) ~[spring-beans-5.1.10.RELEASE.jar:5.1.10.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.getObjectForBeanInstance(AbstractBeanFactory.java:1674) ~[spring-beans-5.1.10.RELEASE.jar:5.1.10.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.getObjectForBeanInstance(AbstractAutowireCapableBeanFactory.java:1249) ~[spring-beans-5.1.10.RELEASE.jar:5.1.10.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:257) ~[spring-beans-5.1.10.RELEASE.jar:5.1.10.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) ~[spring-beans-5.1.10.RELEASE.jar:5.1.10.RELEASE]
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:277) ~[spring-beans-5.1.10.RELEASE.jar:5.1.10.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.addCandidateEntry(DefaultListableBeanFactory.java:1478) ~[spring-beans-5.1.10.RELEASE.jar:5.1.10.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1435) ~[spring-beans-5.1.10.RELEASE.jar:5.1.10.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1218) ~[spring-beans-5.1.10.RELEASE.jar:5.1.10.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1175) ~[spring-beans-5.1.10.RELEASE.jar:5.1.10.RELEASE]
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.autowireResource(CommonAnnotationBeanPostProcessor.java:521) ~[spring-context-5.1.10.RELEASE.jar:5.1.10.RELEASE]
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.getResource(CommonAnnotationBeanPostProcessor.java:497) ~[spring-context-5.1.10.RELEASE.jar:5.1.10.RELEASE]
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor$ResourceElement.getResourceToInject(CommonAnnotationBeanPostProcessor.java:637) ~[spring-context-5.1.10.RELEASE.jar:5.1.10.RELEASE]
at org.springframework.beans.factory.annotation.InjectionMetadata$InjectedElement.inject(InjectionMetadata.java:180) ~[spring-beans-5.1.10.RELEASE.jar:5.1.10.RELEASE]
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:90) ~[spring-beans-5.1.10.RELEASE.jar:5.1.10.RELEASE]
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessProperties(CommonAnnotationBeanPostProcessor.java:322) ~[spring-context-5.1.10.RELEASE.jar:5.1.10.RELEASE]
... 33 common frames omitted
就是 DictionaryClient 注入不了。代码如下:
@EnableFeignClients(defaultConfiguration = FeignConfig.class, basePackages = "com.test.check.common.client")
public class TestCheckApplication {
public static void main(String[] args) {
SpringApplication.run(TestCheckApplication.class, args);
}
}
@FeignClient(
value = AppConstant.SYS_APPLICATION_DICTIONARY_NAME,
fallback = DictionaryClientFallBack.class
)
public interface DictionaryClient {
/**
* 获取项目类型枚举
* @param code 字典键
* @return ApiResponseBody
*/
@GetMapping(path = "/dictionaryDetail", produces = {"application/json;charset=UTF-8"})
ApiResponseBody dictionaryDetail(@RequestParam String code) ;
}
@Service
@Slf4j
public class CommonServiceImpl implements ICommonService {
@Resource
private DictionaryClient dictionaryClient;
@Override
public void exportServiceTemplate(TemplateExportParam templateExportParam) throws InvocationTargetException, IllegalAccessException, IOException, ClassNotFoundException, InstantiationException, NoSuchMethodException, NoSuchFieldException {
...
Object data = dictionaryClient.dictionaryDetail(dictionaryField).getData();
...
}
}
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.0.0.RELEASE</version>
</dependency>
讲道理应该没有问题啊,但是就是报错,最后在basePackages的最后加了个“*”,解决了问题。@ComponentScan,@MapperScan都不用加通配符,但是这个不行。。。
结论:
@EnableFeignClients 的 basePackages 要加通配符,修改后:
@EnableFeignClients(defaultConfiguration = FeignConfig.class, basePackages = "com.kes.cybereng.check.common.client.*")
网友评论