First, when I use Application Listener to bind events, if I use Application Context to get bean objects, no matter where I use feign, I prompt NullPointerException. Exceptions are as follows:
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.fcbox.chain.fegin.TestFeginClient': FactoryBean threw exception on object creation; nested exception is java.lang.NullPointerException
at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:178)
at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getObjectFromFactoryBean(FactoryBeanRegistrySupport.java:101)
at org.springframework.beans.factory.support.AbstractBeanFactory.getObjectForBeanInstance(AbstractBeanFactory.java:1674)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.getObjectForBeanInstance(AbstractAutowireCapableBeanFactory.java:1249)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:257)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:277)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.addCandidateEntry(DefaultListableBeanFactory.java:1474)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1431)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1214)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1171)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:593)
... 19 common frames omitted
Caused by: java.lang.NullPointerException: null
at com.fcbox.chain.common.utils.SpringBeanLoader.getBeanOfType(SpringBeanLoader.java:54)
at com.fcbox.chain.eventframework.InitRegisterHandlersProcessor.onApplicationEvent(InitRegisterHandlersProcessor.java:34)
at com.fcbox.chain.eventframework.InitRegisterHandlersProcessor.onApplicationEvent(InitRegisterHandlersProcessor.java:17)
at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172)
at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165)
at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139)
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:402)
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:408)
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:359)
at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:896)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:552)
at org.springframework.cloud.context.named.NamedContextFactory.createContext(NamedContextFactory.java:136)
The code is as follows:
@Component
public class InitRegisterHandlersProcessor implements ApplicationListener<ContextRefreshedEvent> {
@Autowired
private EventDispatcher eventDispatcher;
@Autowired
private AutoCloseOrderCxcHandler autoCloseOrderCxcHandler;
@Autowired
private EventServiceExecutor eventServiceExecutor;
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
/**
* Register all processors
*/
EventDispatcher eventDispatcher = SpringBeanLoader.getBeanOfType(EventDispatcher.class);
eventDispatcher.registerHandler(EventType.CXC_SITE_CLOSE_REFUND,SpringBeanLoader.getBeanOfType(AutoCloseOrderCxcHandler.class));
/**
* Register, Start Task Execution
*/
SpringBeanLoader.getBeanOfType(EventServiceExecutor.class).startExecute();
}
}
Second, when I use Application Listener to bind events, if I inject binding events directly in @Autowired mode, if feign is used in events, I will also prompt the same error.
The code is as follows:
@Component
public class InitRegisterHandlersProcessor implements ApplicationListener<ContextRefreshedEvent> {
@Autowired
private EventDispatcher eventDispatcher;
@Autowired
private AutoCloseOrderCxcHandler autoCloseOrderCxcHandler;
@Autowired
private EventServiceExecutor eventServiceExecutor;
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
eventDispatcher.registerHandler(EventType.CXC_SITE_CLOSE_REFUND,autoCloseOrderCxcHandler);
eventServiceExecutor.startExecute();
}
}
The code for the event is as follows:
@Slf4j
@Component
public class AutoCloseOrderCxcHandler implements Handler<ChainOvertimeEvent> {
@Autowired
@Qualifier(value = "overtimeProcessor")
AfterHandlerProcessor processor;
@Autowired
TestFeginClient testFeginClient;
@Override
public void handleEvent(ChainOvertimeEvent event) {
EventHandlerResult result;
try {
String s = testFeginClient.testApp();
log.info("testApp:{}", JSONObject.toJSONString(s));
} catch (Exception e) {
log.error("AutoCloseOrderCxcHandler fail execute:{}", event, e);
result = EventHandlerResult.fail(e.getMessage());
}
}
}
Comment From: lipeng632930871
I'm using the latest version.that is Greenwich SR3
Comment From: ryanjbaxter
Can you provide a complete, minimal, verifiable sample that reproduces the problem? It should be available as a GitHub (or similar) project or attached to this issue as a zip file.
Comment From: lipeng632930871
spring-cloud-fegin-test This problem appears in the chain-job. You can start eureka-server, chain-app and chain-job respectively, and then access "test / testcollect". When I uncomment the comments in autocloseordercxchandler, restarting the chain-job will reproduce this problem
Comment From: lipeng632930871
Who can tell me how to solve this problem?
Comment From: spencergibb
feign clients can cause early initialization errors, which in your case it does. Injecting
ObjectProvider<TestFeginClient> testFeginClient;
fixes the issue.