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

基于Spring Boot构造函数的依赖项注入不起作用

淳于亦
2023-03-14

我使用Spring Boot开发了REST服务。在其中一个REST控制器中,我有一个基于字段的依赖注入,我想将其更改为基于构造函数的依赖注入。我的依赖注入设置目前如下所示:

@RestController
public class ParameterDateController {

    private ParameterDateController() {
    }

    private ParameterDate parameterDate;

    private ParameterDateController(ParameterDate parameterDate) {
        this.parameterDate = parameterDate;
    }

    @Autowired
    private ParameterDateService parameterDateService;

// here are the metods of the endpoints
}

使用此设置,一切正常。我想将ParameterDateService更改为基于构造函数,我尝试了以下方法:

@RestController
public class ParameterDateController {

    private ParameterDateController() {
    }

    private ParameterDate parameterDate;

    private ParameterDateController(ParameterDate parameterDate) {
        this.parameterDate = parameterDate;
    }

    private ParameterDateService parameterDateService;

    private ParameterDateController(ParameterDateService parameterDateService) {
        this.parameterDateService = parameterDateService;
    }

// here are the metods of the endpoints
}

更改为基于构造函数的依赖注入后,当我尝试像这样注入依赖时,我会得到一个NullPointerException参数数据ervice.post参数日期(参数日期);。当我将其设置为基于字段的依赖注入时,我以相同的方式注入,并且不会给出NullPointerExceptionParameterDate的基于构造函数的依赖注入按预期工作。

我做错了什么?

共有1个答案

仰钧
2023-03-14

如果希望通过构造函数连接两个依赖项,则必须将它们声明为构造函数参数,因此必须在此处声明:

public ParameterDateController(ParameterDate parameterDate, ParameterDateService parameterDateService) {
    this.parameterDate = parameterDate;
    this.parameterDateService = parameterDateService;
}

这里有一个关于构造函数注入的好答案。

 类似资料:
  • 当容器调用具有许多参数的类构造函数时,完成基于构造函数的DI,每个参数表示对另一个类的依赖。 例子 (Example) 以下示例显示了一个类TextEditor ,它只能通过构造函数注入进行依赖注入。 让我们有一个可用的Eclipse IDE,并按照以下步骤创建一个Spring应用程序 - 脚步 描述 1 创建一个名为SpringExample的项目,并在创建的项目中的src文件夹下创建一个包co

  • 和另一个类: 在这种情况下,服务将按照预期注入到A类中。据我所知,你不能在a类中使用构造函数,否则注入将无法工作。有没有一种方法可以在a类中使用一个构造函数,同时注入服务?即: 在这种情况下,我得到的服务是空的,无论如何要解决这个问题?我希望能够从类型A中使用“new”创建一个对象,并注入服务,这可能吗?

  • 我的应用程序正在部署到IBM WebSphere上。我有一个简单的服务,我想知道依赖注入在这种情况下是如何工作的。 它失败,出现以下错误: [错误]CWWKZ0002E:启动应用程序my app时发生异常。例外消息是:com。国际商用机器公司ws。容器服务状态StateChangeException:com。国际商用机器公司ws。cdi。CDIException:com。国际商用机器公司wsspi

  • 我想把它转换成这样的东西: 这将使类不可变并且更容易进行单元测试。问题是,由于executorService需要通过@Resource注释获得,它似乎不能通过构造函数注入。

  • 在我的ASP. NET Core应用程序中,我有一个具有多个构造函数的标记助手。当ASP. NET 5尝试解析类型时,这会在运行时导致以下错误: 在类型'MyNameSpace中发现了多个接受所有给定参数类型的构造函数。MyTagHelper'.应该只有一个适用的构造函数。 其中一个构造函数是无参数的,另一个有一些参数不是注册类型的参数。我希望它使用无参数构造函数。 有没有办法让ASP. NET

  • 在之前的所有JUnit版本中,测试构造函数或方法都不允许有参数(至少不能使用标准的Runner实现)。作为JUnit Jupiter的主要变化之一,测试构造函数和方法现在都允许有参数。这带来了更大的灵活性,并为构造函数和方法启用依赖注入。 ParameterResolver定义了测试扩展的API,希望在运行时动态解析参数。如果测试构造函数或@Test, @TestFactory, @BeforeE