Spring 引导无法自动装配 @ConfigurationProperties

Spring Boot can't autowire @ConfigurationProperties

这是我的 FileStorageProperties class:

 @Data
 @ConfigurationProperties(prefix = "file")
 public class FileStorageProperties {
       private String uploadDir;
 }

这让我说:未通过@enableconfigurationproperties 注册或标记为 spring 组件

这是我的 FileStorageService :

@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 中构造函数的参数 0。cse616.Service.FileStorageService 需要找不到类型 'com.mua.cse616.Property.FileStorageProperties' 的 bean。

注入点有如下注解: - @org.springframework.beans.factory.annotation.Autowired(要求=真)

操作:

考虑在您的配置中定义类型为 'com.mua.cse616.Property.FileStorageProperties' 的 bean。


我该如何解决?

这是预期的,因为 @ConfigurationProperties 不会使 class 变成 Spring Component。用 @Component 标记 class ,它应该可以工作。请注意,只有 Component.

才能注入 class

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

在 FileStorageProperties 添加波纹管注释 class:

@Component

尝试使用 @ConfigurationProperties@Component

进行注释

在这里,Spring Boot @ConfigurationProperties 是外部化的注释 configuration.if 您正试图将 属性 值从 属性 文件注入 class,您可以在 class 级别添加 @ConfigurationProperties,并使用构造型注释,例如 @Component 或将 @ConfigurationProperties 添加到 @Bean 方法。