Java 弹簧靴筒';t autowire@ConfigurationProperties

Java 弹簧靴筒';t autowire@ConfigurationProperties,java,spring,spring-boot,bean-validation,spring-restcontroller,Java,Spring,Spring Boot,Bean Validation,Spring Restcontroller,这是我的FileStorageProperties类: @Data @ConfigurationProperties(prefix = "file") public class FileStorageProperties { private String uploadDir; } 这让我说:未通过@enableconfigurationproperties注册或标记为spring组件 这是我的文件存储服务: @Service public class FileStorag

这是我的
FileStorageProperties
类:

 @Data
 @ConfigurationProperties(prefix = "file")
 public class FileStorageProperties {
       private String uploadDir;
 }
这让我说:未通过@enableconfigurationproperties注册或标记为spring组件

这是我的
文件存储服务

@Service
public class FileStorageService {

private final Path fileStorageLocation;

@Autowired
public FileStorageService(FileStorageProperties fileStorageProperties) {
    this.fileStorageLocation = Paths.get(fileStorageProperties.getUploadDir())
            .toAbsolutePath().normalize();

    try {
        Files.createDirectories(this.fileStorageLocation);
    } catch (Exception ex) {
        throw new FileStorageException("Could not create the directory where the uploaded files will be stored.", ex);
    }
}

public String storeFile(MultipartFile file) {
    // Normalize file name
    String fileName = StringUtils.cleanPath(file.getOriginalFilename());

    try {
        // Check if the file's name contains invalid characters
        if(fileName.contains("..")) {
            throw new FileStorageException("Sorry! Filename contains invalid path sequence " + fileName);
        }

        // Copy file to the target location (Replacing existing file with the same name)
        Path targetLocation = this.fileStorageLocation.resolve(fileName);
        Files.copy(file.getInputStream(), targetLocation, StandardCopyOption.REPLACE_EXISTING);

        return fileName;
    } catch (IOException ex) {
        throw new FileStorageException("Could not store file " + fileName + ". Please try again!", ex);
    }
}

public Resource loadFileAsResource(String fileName) {
    try {
        Path filePath = this.fileStorageLocation.resolve(fileName).normalize();
        Resource resource = new UrlResource(filePath.toUri());
        if(resource.exists()) {
            return resource;
        } else {
            throw new MyFileNotFoundException("File not found " + fileName);
        }
    } catch (MalformedURLException ex) {
        throw new MyFileNotFoundException("File not found " + fileName, ex);
    }
}
}
这使我错误地说:无法自动关联未找到类型的bean

这是我的项目结构:

当我尝试运行它时,它会给我:


应用程序无法启动

说明:

com.mua.cse616.Service.FileStorageService中构造函数的参数0需要找不到类型为“com.mua.cse616.Property.FileStorageProperties”的bean

注入点具有以下注释: -@org.springframework.beans.factory.annotation.Autowired(必需=true)

行动:

考虑在配置中定义“com.mua.cse616.Property.FileStorageProperties”类型的bean



如何解决此问题?

这是意料之中的,因为
@ConfigurationProperties
不会使一个类成为Spring
组件。用
@Component
标记该类,它应该可以工作。请注意,类只有在它是
组件时才能被注入

编辑:来自Spring 2.2+()
@ConfigurationProperties
扫描
使用
@ConfigurationProperties
注释的类现在可以通过类路径扫描找到,这是使用
@EnableConfigurationProperties
@Component
的替代方法
@configurationproperties添加到应用程序中以启用扫描。

在FileStorageProperties类中添加以下注释:

@Component

尝试使用@ConfigurationProperties和@Component进行注释


在这里,Spring Boot@ConfigurationProperties是外部化配置的注释,您可以在类级别添加@ConfigurationProperties和原型注释,例如@Component,或者将@ConfigurationProperties添加到@Bean方法。

请在
FileStorageProperties
中添加
@Component
注释。或者您可以添加
@EnableConfigurationProperties({FileStorageProperties.class})
到任何
@Configuration
注释类。但是Baeldung说文档确实指出您需要提供
@ConfigurationPropertiesScan
。我正在相应地更新答案