Java 在服务类内引用配置类时出现BeanCreationException错误
我正在尝试Java 在服务类内引用配置类时出现BeanCreationException错误,java,spring,spring-boot,Java,Spring,Spring Boot,我正在尝试@Autowire在@Service类中创建@Configuration类。基本上,我的@Configuration类包含到我的自定义.properties文件的映射。当我尝试在我的服务类中自动连接我的配置类时,BeanCreationException。我不知道会发生什么。只是遵循了从spring创建属性类的指南。我一定错过了什么 另外,当我尝试将@Configuration类自动连接到另一个@Configuration类时,它运行平稳 目前,我知道,prop总是空的,因为当我删除p
@Autowire
在@Service
类中创建@Configuration
类。基本上,我的@Configuration
类包含到我的自定义.properties
文件的映射。当我尝试在我的服务类中自动连接我的配置类时,BeanCreationException
。我不知道会发生什么。只是遵循了从spring创建属性类的指南。我一定错过了什么
另外,当我尝试将@Configuration
类自动连接到另一个@Configuration
类时,它运行平稳
目前,我知道,prop
总是空的,因为当我删除prop.getUploadFileLocation()
调用时,一切都会好起来。自动接线期间一定有问题
这是我的服务课
@服务
公共类图像服务{
公共静态记录器Logger=Logger.getLogger(ImageService.class.getName());
@自动连线
MyProperties道具;
私有最终字符串文件_UPLOAD_LOCATION=prop.getUploadFileLocation()+“uploads/images/”;
公共无效上载(字符串base64ImageFIle)引发IOException{
logger.info(文件上传位置);
}
}
这是我的配置类
@数据
@配置
@配置属性(前缀=“我的”)
公共类MyProperties{
私有字符串资源定位;
私有字符串资源URL;
公共字符串getUploadFileLocation(){
返回getResourceLocation().replace(“文件:///”,“”);
}
公共字符串getBaseResourceUrl(){
返回getResourceUrl()。替换(“**”和“”);
}
}
在这里,我可以成功地使用MyProperties
@配置
公共类StaticResourceConfiguration实现WebMVCConfiguer{
@自动连线
MyProperties道具;
@凌驾
public void addResourceHandlers(ResourceHandlerRegistry注册表){
registry.addResourceHandler(prop.getResourceUrl())
.addResourceLocations(prop.getResourceLocation());
}
}
如果您需要在StaticResourceConfiguration
bean之前创建MyProperties
bean,您可以将@ConditionalOnBean(MyProperties.class)
如下所示。Spring将在处理StaticResourceConfiguration
之前确保MyProperties
存在
@Configuration
@ConditionalOnBean(MyProperties.class)
public class StaticResourceConfiguration implements WebMvcConfigurer {
如果您需要在
StaticResourceConfiguration
bean之前创建MyProperties
bean,您可以按如下方式放置@ConditionalOnBean(MyProperties.class)
。Spring将在处理StaticResourceConfiguration
之前确保MyProperties
存在
@Configuration
@ConditionalOnBean(MyProperties.class)
public class StaticResourceConfiguration implements WebMvcConfigurer {
问题是您试图使用自动连接字段来设置内联字段赋值中的值 这意味着
private final String FILE_UPLOAD_LOCATION = prop.getUploadFileLocation() +"uploads/images/";
在道具
自动连线之前执行,这意味着它将始终为空
缓解这种情况的方法是使用构造函数注入
@Service
public class ImageService {
//Fine since you are using static method
public static Logger logger = Logger.getLogger(ImageService.class.getName());
//Not needed if you are only using it to set FILE_UPLOAD_LOCATION
//Allows field to be final
private final MyProperties prop;
//Still final
private final String FILE_UPLOAD_LOCATION;
//No need for @Autowired since implicit on component constructors
ImageService(MyProperties prop){
//Again not needed if you aren't going to use anywhere else in the class
this.prop = prop;
FILE_UPLOAD_LOCATION = prop.getUploadFileLocation() +"uploads/images/";
}
public void upload(String base64ImageFIle) throws IOException {
logger.info(FILE_UPLOAD_LOCATION);
}
}
请参阅,了解为什么构造函数通常优于@autowired问题在于,您试图使用autowired字段来设置内联字段赋值中的值 这意味着
private final String FILE_UPLOAD_LOCATION = prop.getUploadFileLocation() +"uploads/images/";
在道具
自动连线之前执行,这意味着它将始终为空
缓解这种情况的方法是使用构造函数注入
@Service
public class ImageService {
//Fine since you are using static method
public static Logger logger = Logger.getLogger(ImageService.class.getName());
//Not needed if you are only using it to set FILE_UPLOAD_LOCATION
//Allows field to be final
private final MyProperties prop;
//Still final
private final String FILE_UPLOAD_LOCATION;
//No need for @Autowired since implicit on component constructors
ImageService(MyProperties prop){
//Again not needed if you aren't going to use anywhere else in the class
this.prop = prop;
FILE_UPLOAD_LOCATION = prop.getUploadFileLocation() +"uploads/images/";
}
public void upload(String base64ImageFIle) throws IOException {
logger.info(FILE_UPLOAD_LOCATION);
}
}
请参阅,了解为什么构造函数通常优于@autowired使用构造函数注入。字段注入在对象构造完成后才应用。@chrylis onstrike-这不是整个自动连接的事情吗?至少我是这么理解的,虽然它仍然是自动连接的,如果你使用构造函数注入,它只是隐式的。spring团队通常不鼓励在字段上使用
autowired
。问题不是您自动连接字段,而是您试图在类实例化后自动连接时在最终声明中使用它。所以它永远不可能是空的。哦,我明白了,我没有注意到那部分。是的,我同意,我把实例化的时间搞错了。自动接线没有问题,只是我使用自动接线字段的时间不正确。请张贴一个答案,这样我就可以接受这一点。基本上我忘了考虑事物的生命周期,使用构造函数注入。字段注入在对象构造完成后才应用。@chrylis onstrike-这不是整个自动连接的事情吗?至少我是这么理解的,虽然它仍然是自动连接的,如果你使用构造函数注入,它只是隐式的。spring团队通常不鼓励在字段上使用autowired
。问题不是您自动连接字段,而是您试图在类实例化后自动连接时在最终声明中使用它。所以它永远不可能是空的。哦,我明白了,我没有注意到那部分。是的,我同意,我把实例化的时间搞错了。自动接线没有问题,只是我使用自动接线字段的时间不正确。请张贴一个答案,这样我就可以接受这一点。基本上,我忘了考虑事物的生命周期。只有当你有一个构造函数(但通常是服务的情况)时,两个注释:<代码> @ AutoDeld是不必要的,如果从@ConfigurationProperties
中提取,通常/通常最好使用@Bean
方法,以避免在配置机制和服务类之间存在不必要的直接链接。@chrylis onstrike-您能详细说明第二个注意事项吗,不确定我是否遵循?ImageService
需要S