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
方法。
这是我的 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
.
编辑:来自 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
方法。