Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在服务类内引用配置类时出现BeanCreationException错误_Java_Spring_Spring Boot - Fatal编程技术网

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