当前位置: 首页 > 知识库问答 >
问题:

Spring Boot中的继承:@Autowere字段为空(需要在非Spring托管类中自动装配-多个实例)

高夜洛
2023-03-14

我已经运行了带有基于注释的配置的Spring Boot,但我#是Spring的新手。我真的在其他地方找不到解决我的问题的方法。我有具有以下继承结构的任务对象:

  • 父任务

现在,我想将一些存储库自动关联到SystemTask。此外,我还想将存储库和一些服务自动关联到UserTask(及其所有子项)。

如何做到这一点?使用以下代码,我得到一个空指针异常

家长:

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
    }
}

My Repository是一个标准的mongo Repository IMLPement,不应该有任何错误。我的“someService”如下所示:

@Service
public class SomeService{

    // some fields

    @Autowired
    private someOtherRepository someOtherRepository;

    // some methods

    public void doSomething() {
        //...
    }
}

所以我的问题又来了:

  1. 如何解决NullPointerException?
  2. 如何自动连接用户任务中的字段,以便它们在特定用户类中可用?

提前谢谢大家。

编辑:这是我在需要时创建新任务的方式:

@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个答案

慕弘深
2023-03-14

我解决了我的问题,实际上在非spring托管类中需要一个自动连接的服务/存储库。我使用了手动依赖注入,如下所述:
如何手动将bean与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);
    }
}
傅胡媚
2023-03-14

您需要在您的SpecificUserTask类上添加注释,就像组件一样。然后,当您使用Autowired时,您的SpecificUserTask将注入它的所有内容以及它的超类。

如果没有使用Spring的特定注释对对象进行注释,Spring对您的SpecificUserTask一无所知。

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

“活在”应用程序上下文中意味着上下文实例化了对象,而不是您,您永远不应该创建新的MyClass()。容器找到每个注入点并在那里设置一个实例。

因此,当您使用@Service@Component等注释注释bean时,Spring会找到它们并实例化。

 类似资料:
  • 但我们只对其中一些答案感兴趣。 注意:以上只是展示结构的示例。每个映射都有几十个元素。 我们真正需要的是:https://github.com/pact-foundation/pact-specification/issues/38,但它是计划在V.4中使用的。与此同时,我们正在尝试一种不同的方法。我现在尝试做的是指定列表的每个元素都是一个非空映射。另一种方法是指定列表的每个元素都不为空。这些都可

  • 问题内容: 我通过定义一个托管属性将一个托管bean注入另一个托管bean遇到了一些麻烦。我正在谷歌搜索和stackoverflow 3天,但没有结果… 我正在使用Eclipse 4.2进行开发并将其部署到集成的Tomcat 7中 那么,谁能告诉我,为什么我的财产为空? pom.xml web.xml 我已经在applicationContext中设置了可扫描@Autowired注释的bean。(

  • 我正在从这里的教程中学习Java spring Boot 我一直得到“api.database.basic.apidatabase.models.TopicService中的字段topicRepository需要一个类型为'api.database.basic.apidatabase.interface.topicRepository'的bean,但找不到。” 我读到这个错误可能是因为compon

  • 问题内容: 我的文凭项目有一个大问题,如果你们能帮助我,我将非常高兴!我做了一个Maven多模块项目,有3个“核心项目” :(父母) :包含所有的实体和接口域模型是由需要 和对 :将GUI和Hessian关联起来 :这里是我的仓库,我到数据库连接和接口的实现 和具有在Maven作为依赖。 现在,每次尝试在Tomcat上启动服务器时,都会出现以下错误: 模型库: 卡萨: MeinRemoteDien

  • 问题内容: 当超类具有标记为final的字段但子类覆盖(隐藏?)此字段时,会发生什么?“最终”并没有阻止它,不是吗?我正在处理的特定示例是Building类,从中继承了各种建筑物。除其他事项外,每种类型的成本对于每个子类都应是最终成本,但是每种类型的建筑物应具有自己的成本。 编辑:从那以后,我意识到我不知道上面我在说什么。我真正想要的是成本的静态变量。但是,如果我在超类中声明这些静态变量,则它们对

  • 问题内容: 我对Go之类的打字语言还是陌生的,并且正在尝试学习实现事物的最佳方法。 我有两个表示将插入到mongodb数据库中的模型的结构。一个结构(投资)具有另一个结构(组)作为其字段之一。 我遇到的问题是在投资模型中,不需要组。如果没有组,我认为最好不要将其插入数据库。在Go中处理这种数据库模型的最佳方法是什么? 问题答案: tl; dr :使用,如果您需要担心零值和null /未指定之间的差