Java 春豆没有被捡起来?

Java 春豆没有被捡起来?,java,spring,Java,Spring,我有一个java spring项目,提供以下服务: @Slf4j public class DialogFlowService { private String projectId; private String sessionId; private String languageCode; public DialogFlowService(DialogFlowConfig dialogFlowConfig) { log.info("aaa"

我有一个java spring项目,提供以下服务:

@Slf4j
public class DialogFlowService {

    private String projectId;
    private String sessionId;
    private String languageCode;

    public DialogFlowService(DialogFlowConfig dialogFlowConfig) {
        log.info("aaa" + dialogFlowConfig.languageCode);
        this.projectId = dialogFlowConfig.projectId;
        this.sessionId = dialogFlowConfig.sessionId;
        this.languageCode = dialogFlowConfig.languageCode;
    }
}
构造函数将以下类作为参数:

@Configuration
@ConfigurationProperties(prefix = "dialog-flow")
public class DialogFlowConfig {

    @NotNull
    public String projectId;

    @NotNull
    public String sessionId;

    @NotNull
    public String languageCode;
}
理论上,这应该由以下bean实例化:

@Bean
public DialogFlowService dialogFlowService() {
   return new DialogFlowService(new DialogFlowConfig());
}

然而在实践中,当我尝试记录其中一个构造函数参数时,它显示为null。我遗漏了什么吗?

这与这里描述的内容类似:

本质上,通过自己实例化
对话框flowconfig
实例,而不是将其交给Spring,可以阻止Spring对其进行后期处理并注入
配置属性
属性值

而是为
DialogFlowConfig
创建一个
@Bean
方法,并使用相应的Springbean创建您的
DialogFlowService
。比如说

@Bean
public DialogFlowService dialogFlowService(DialogFlowConfig dialogFlowConfig) {
    return new DialogFlowService(dialogFlowConfig);
}

@Bean
public DialogFlowConfig dialogFlowConfig() {
    return new DialogFlowConfig();
}
Spring将使用
@Bean
注释的
dialogFlowConfig()
工厂Bean方法来实例化和处理相应的实例(设置其字段)。然后将它与
dialogFlowService()
工厂方法一起使用


注意:如果这样做,则需要从
对话框flowconfig
中删除
@Configuration
注释,前提是您之前正在扫描该注释。或者,如果您正确地扫描了组件,您甚至不需要我建议的附加
@Bean
注释
dialogFlowConfig()
工厂方法。只需在
dialogFlowService
方法中插入由其
@Configuration
注释声明的
DialogFlowConfig
bean。

我认为这样更改第三个代码片段就可以了

@Bean
public DialogFlowService dialogFlowService(DialogFlowConfig  dialogFlowConfig) {
    return new DialogFlowService(dialogFlowConfig);
}
对话框flowconfig
类已标记为
@Configuration
。因此,它由Spring应用程序上下文管理。因此,您不必使用new关键字显式创建对象。你可以把它当作一个参数


尝试将
@EnableConfigurationProperties(DialogFlowConfig.class)
放入Spring应用程序类。

首先,您需要在DialogFlowConfig中使用setter getter或在所有属性上使用@Value注释。您还需要使用@service stereotype注释服务类DialogFlowService

是否在
DialogFlowService
下打印此对象
DialogFlowService
您需要在
DialogFlowService
bean的参数中自动连线
DialogFlowService
。您还需要添加
@Setter
(在使用lombok时),或者手动为
对话框flowconfig
中的字段添加Setter。可能最好也添加getter,并将字段设置为private。你的意思是dialogFlowConfig.languageCode提供null吗?那
@Bean
在哪里?另外,在同一个类上混合使用
@Configuration
@ConfigurationProperties
通常不是一个好主意
@ConfigurationProperties
应该是一个简单的记录类。@chrylis onstrike-你为什么这么说,spring官方软件包在同一个类中使用
@ConfigurationProperties
@ConfigurationProperties
仍然不起作用,因为config类没有setter。你确定@123需要setter吗?因为他使用了@ConfigurationProperties(prefix=“dialog flow”)从项目中的任何属性文件中获取这些属性,对吗?它们仍然需要设置。这应该是可以接受的答案。OP应该连接bean并将getter/setter添加到@ConfigurationProperties类中。@123不,使用这种方法时不必设置任何setter。如果您有任何答案,请将其发布。@123我错过了
@配置
,但它不会中断。一个bean将覆盖另一个,因为它们具有相同的隐式bean名称。尽管如此,我还是留了一张便条来澄清事情。