gpt4 book ai didi

java - 无法使用反射访问 @ConfigurationProperties 类的变量?

转载 作者:行者123 更新时间:2023-12-04 10:56:15 25 4
gpt4 key购买 nike

以下是 spring boot 项目中 YML 文件中的条目。

application:
applicationPath: "/demo"
defaultFilePath: ${application.applicationPath}childDemo/import_files/
actDocsPath: ${application.applicationPath}childDemo2/act_docs/
bgJobsLogs: ${application.applicationPath}childDemo3/bgjobs_logs/

在这些位置,我在我的项目中保留了一些文档。

要求是......在项目启动时我想创建所有这些目录结构,因此我创建了一个类......
package com.sbill.app.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

@Configuration
@ConfigurationProperties(prefix = "application", ignoreUnknownFields = false)
public class ApplicationProperties {

@Value("${application.applicationPath}")
public String applicationPath;

@Value("${application.defaultFilePath}")
public String defaultFilePath;

@Value("${application.actDocsPath}")
public String actDocsPath;

@Value("${application.bgJobsLogs}")
public String bgJobsLogs;

public String getDefaultFilePath() {
return defaultFilePath;
}

public void setDefaultFilePath(String defaultFilePath) {
this.defaultFilePath = defaultFilePath;
}

public String getActDocsPath() {
return actDocsPath;
}

public void setActDocsPath(String actDocsPath) {
this.actDocsPath = actDocsPath;
}

public String getBgJobsLogs() {
return bgJobsLogs;
}

public String getApplicationPath() {
return applicationPath;
}

public void setApplicationPath(String applicationPath) {
this.applicationPath = applicationPath;
}
}

我创建的一个类是用 CommandLineRunner 实现的在启动时调用
package com.sbill.app.config;

import java.io.File;
import java.lang.reflect.Field;
import java.util.Optional;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Component;

import com.sbill.app.domain.User;
import com.sbill.app.repository.UserRepository;
import com.sbill.app.service.util.FieldReqValidationUtil;

@Component
public class SbillStartupRunner implements CommandLineRunner {

@Autowired
ApplicationProperties applicationProperties;

@Override
public void run(String... args) throws Exception {

System.out.println(applicationProperties.getDefaultFilePath());
System.out.println(applicationProperties.getApplicationPath());

Field[] fields = applicationProperties.getClass().getDeclaredFields();
for(Field f : fields){
f.setAccessible(true);
Class t = f.getType();
Object v = f.get(applicationProperties);

File applicationpath = new File(v.toString());
if (!applicationpath.exists()) {
if (applicationpath.mkdirs()) {
System.out.println("Directory is created!");
} else {
System.out.println("Failed to create directory!");
}
}
System.out.println(applicationpath.getAbsolutePath());


}
}
}

我的问题是:- 使用 setter/getter 路径正在打印,但使用反射我无法访问字段..

最佳答案

getClass()将返回对象的实际类,例如它可能是一个子类,并且 getDeclaredFields()只返回在该类中声明的字段。获取 ApplicationProperties 中声明的字段,只需使用 ApplicationProperties.class.getDeclaredFields() .

请注意,您可以使用 AccessibleObject.setAccessible 改进代码。 , 一次设置所有对象的可访问性状态,以避免重复进行可能代价高昂的安全检查。另外,使用NIO强烈推荐在这里,因为它允许在目录创建失败时进行诊断,而不是返回无用的 boolean值(value)。

Field[] fields = ApplicationProperties.class.getDeclaredFields();
AccessibleObject.setAccessible(fields, true);
for(Field f : fields){
Object v = f.get(applicationProperties);
Path p = Files.createDirectories(Paths.get(v.toString()));
System.out.println(p.toAbsolutePath());
}

关于java - 无法使用反射访问 @ConfigurationProperties 类的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59169082/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com