Java 春豆没有被捡起来?
我有一个java spring项目,提供以下服务: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"
@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名称。尽管如此,我还是留了一张便条来澄清事情。