java - Spring - 使用@PostCostruct 时获取 NullPointErexception

标签 java spring

我正在使用 @PostCostruct 注释获取初始化方法以在我的 Sprin Boot 应用程序启动时运行代码。

@Service("jobManager")
public class JobManager {

    @Autowired
    SchedulerFactoryBean scheduler;

    @Autowired
    InterruttoreService interruttoreService;

    @PostConstruct
    public void createInitialJobs() throws SchedulerException {
        List<Interruttore> interruttori = interruttoreService.findAllSwitches();

        for (int i = 0; i < interruttori.size(); i++) {
            Interruttore interruttore = interruttori.get(i);
            interruttoreService.toggleSwitchOnStartup(interruttore); 

        }

    }

interruttoreService.toggleSwitchOnStartup(interruttore) 在服务类中并且是以下内容(作业管理器在此类中自动连接)

@Override
    public void toggleSwitchOnStartup(Interruttore interruttore) {
        Date nextTimeout = interruttore.getTimeoutDate();
        Date date = new Date();
        Date now = new Timestamp(date.getTime());
        if (nextTimeout == null) {
            nextTimeout = now;
        }
        int idInterruttore = interruttore.getIdInterruttore();

        if(nextTimeout.after(now)){ //c'è un timeout futuro

            try { lightOn(idInterruttore);
            jobManager.createJob(interruttore, nextTimeout);
        } catch (SchedulerException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        } else {
            shutDown(idInterruttore);
        }

    }

从这个方法调用 jobManager 时我得到一个 NullPointerException,不知道为什么如果 bean 是在 @PostCostruct 期间创建的...

这是错误的堆栈跟踪

Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'interruttoreService': Unsatisfied dependency expressed through field 'jobManager'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jobManager': Invocation of init method failed; nested exception is java.lang.NullPointerException
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:569)
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:349)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1219)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
    at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:207)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1128)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1056)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:566)
    ... 53 more
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jobManager': Invocation of init method failed; nested exception is java.lang.NullPointerException
    at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:136)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:408)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1575)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
    at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:207)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1128)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1056)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:566)
    ... 66 more
Caused by: java.lang.NullPointerException
    at it.besmart.service.InterruttoreServiceImpl.toggleSwitchOnStartup(InterruttoreServiceImpl.java:112)
    at it.besmart.service.InterruttoreServiceImpl$$FastClassBySpringCGLIB$$907e162e.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:720)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:655)
    at it.besmart.service.InterruttoreServiceImpl$$EnhancerBySpringCGLIB$$e2a6ab4b.toggleSwitchOnStartup(<generated>)
    at it.besmart.quartz.JobManager.createInitialJobs(JobManager.java:47)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(InitDestroyAnnotationBeanPostProcessor.java:365)
    at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(InitDestroyAnnotationBeanPostProcessor.java:310)
    at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:133)
    ... 78 more

interruttoreService 是自动正确连接的,因为在启动后它就开始照常工作。

关于jobManager,我只是用这种方式在InterruttoreService.class中@Autowire它

@Service("interruttoreService")
@Transactional
public class InterruttoreServiceImpl implements InterruttoreService {

    @Autowired
    JobManager jobManager;
....


....

最佳答案

这是紧密耦合的代码(您将 InterruttoreService 注入(inject)到 JobManager 中,同时将 JobManager 注入(inject)到 InterruttoreService).

为什么不从 JobManager 中删除 InterruttoreService 注入(inject),并让 toggleSwitchOnStartup()@PostCostruct 中完成> 注释方法都在 InterruttoreService 中,直接在 JobManager 已经连接的地方。

关于java - Spring - 使用@PostCostruct 时获取 NullPointErexception,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40889908/

相关文章:

java - 是否有制作人类可读代码的基本标准和实践?

java - Selenium:在 Java 中搜索 By 定位器的子项

java - 如何从注释中获取 Spring 配置文件名称?

java - 我可以使用哪种 Spring 集成模式?

java - HTTP 状态 500 - servlet fitTrackerServlet 的 Servlet.init() 抛出异常

java - 将上传的 Excel 文件中的数据存储在数据库中

java - Kotlin - 无法写入 JSON : Conflicting getter definitions for property (HttpMessageNotWritableException)

java - AWS Lambda 函数不会反序列化有效负载

java - 无法通过 spring-boot-starter-test 测试 Spring Boot REST API,而相同的 "api"适用于 Postman

java - 在方法之前包含 spring shell 的参数