代码之家  ›  专栏  ›  技术社区  ›  Nas3nmann

Spring引导中的继承:@Autowired字段为null(需要在非Spring托管类中自动连接-多个实例)

  •  3
  • Nas3nmann  · 技术社区  · 7 年前

    我得到了具有以下继承结构的任务对象:

      • 系统任务
      • 用户任务
        • 特定用户任务

    我该怎么做?通过以下代码,我得到了一个空指针异常。

    家长:

    public abstract class ParentTask implements Runnable {
    
        // some fields
    
        protected ParentTask(/*fields*/) {
            //this.fields = fields;
        }
    
        @Override
        public abstract void run();
    
    }
    

    第一个孩子:

    public class SystemTask extends ParentTask {
    
        @Autowired
        protected SomeService someService;
    
        protected SystemTask(/*fields*/) {
            super(fields);
            //set some other fields
        }
    
        @Override
        public void run() {
            someService.doSomething(); // <-- nullPointerException
        }
    }
    

    public abstract class UserTask extends ParentTask {
    
        @Autowired
        protected SomeService someService;
        @Autowired
        protected SomeRepository someRepository;
    
        protected UserTask(/*fields*/) {
            super(fields);
        }
    
        @Override
        public abstract void run();
    
    }
    

    UserTask的子级(应具有UserTask的自动连接资源)

    public class SpecificUserTask extends UserTask{
    
        private SpecificUserTask (/*fields*/) {
            super(fields);
            //set some other fields
        }
    
        @Override
        public void run() {
            // do something
        }
    }
    

    我的存储库是一个标准的mongo存储库,不应该有任何错误。我的“someService”看起来像这样:

    @Service
    public class SomeService{
    
        // some fields
    
        @Autowired
        private someOtherRepository someOtherRepository;
    
        // some methods
    
        public void doSomething() {
            //...
        }
    }
    

    1. 如何解决NullPointerException?
    2. 如何自动连接UserTask中的字段,使其在SpecificUserClass中可用?

    提前谢谢大家。

    @Service
    public class TaskAdministration {
    
        private final TaskAdministrationRepository taskAdministrationRepository;
    
        public void commissionSystemTask(fields) {
    
            SystemTask task = new SystemTask(fields);
            taskScheduler.schedule(task, taskTrigger);
    
            // persist task to restore if necessary
            taskAdministrationRepository.save(task);
        }
    }
    
    2 回复  |  直到 7 年前
        1
  •  9
  •   Orest    7 年前

    您需要在 SpecificUserTask @Component .然后当你 @Autowired 你的 spring将为它注入一切,它是超级类。

    Spring对你的 特定用户任务

    自动连接是通过将一个bean的实例放入另一个bean实例中的字段来实现的。这两个类都应该是bean,并且应该“活”在应用程序上下文中。

    “生活”在应用程序上下文中意味着上下文实例化了对象,而不是你,你永远不应该 new MyClass()

    所以当你用类似这样的注释来注释bean时 @Service @组件 spring找到它们并实例化。

        2
  •  0
  •   Nas3nmann    7 年前


    How do I manually autowire a bean with Spring?

    这样,我可以拥有一个类的多个实例,也可以使用spring管理的服务。这是我现在的代码:

    @Service
    public class TaskAdministration {
    
        @Autowired
        private ApplicationContext appContext;
    
        private final TaskAdministrationRepository taskAdministrationRepository;
    
        public void commissionSystemTask(fields) {
    
            SystemTask task = new SystemTask(trigger);
            AutowireCapableBeanFactory factory = appContext.getAutowireCapableBeanFactory();
            factory.autowireBean( task );
            factory.initializeBean( task, "SystemTask" );
    
            taskScheduler.schedule(task, task.trigger);
    
            // persist task to restore if necessary
            taskAdministrationRepository.save(task);
        }
    }