如何不通过REST调用带依赖注入的REST服务类方法 解决依赖为空问题
问题根源
你直接通过
new SyncRequest()手动实例化对象时,绕过了项目的依赖注入容器管理,容器不会自动为你填充NotebookService、UserManager、ActiveObjects这些依赖,因此所有注入字段都会为null。
正确实现方案
方案1:在可被DI容器管理的类中直接注入SyncRequest(最优方案)
如果调用SyncRequest的外部类本身也受容器管理(比如同为REST服务类、业务Service类、容器管理的组件等),直接在外部类的构造函数上加@Inject注解注入SyncRequest实例即可。
示例代码:
// 调用SyncRequest的外部类,需确保它本身被DI容器识别管理 @Named public class OtherBusinessService { private final SyncRequest syncRequest; @Inject public OtherBusinessService(SyncRequest syncRequest) { this.syncRequest = syncRequest; } public void yourBusinessMethod() { // 直接调用方法即可,所有依赖已经被容器自动填充完成 String result = syncRequest.doSomething(); } }
方案2:调用类无法被DI容器管理时,手动从容器上下文获取实例
如果你是在无法被容器扫描的普通类中调用,可以通过容器上下文工具手动获取已经完成依赖注入的SyncRequest实例,不要自行new对象。如果是Atlassian插件开发场景,可以用官方提供的ComponentLocator获取:
示例代码:
import com.atlassian.sal.api.component.ComponentLocator; public class YourOrdinaryClass { public void yourMethod() { // 从容器中获取已经完成依赖注入的SyncRequest实例 SyncRequest syncRequest = ComponentLocator.getComponent(SyncRequest.class); String result = syncRequest.doSomething(); } }
注意事项
- 确保
SyncRequest类已经被DI容器扫描识别,可给SyncRequest补充@Named/@Component注解标记为容器管理组件,或者确认Spring扫描配置包含了该类所在的包路径。 - 所有声明了依赖注入的类都不要手动new实例,所有实例都优先通过注入或者容器上下文获取。
内容的提问来源于stack exchange,提问作者MarkoRocko
相关产品推荐
相关产品推荐

