英文:
@Value annotation is always NULL
问题
这是我 application.yml
文件中的内容:
aws:
routeconfig:
rolearn: myrolearn
bucketname: mybucket
region: ap-southeast-1
以下是带有 @Value
注解的变量,它们总是保持为 NULL
:
@Value("${aws.routeconfig.rolearn}")
String routeConfigRoleArn;
@Value("${aws.routeconfig.bucketname}")
String bucketName;
@Value("${aws.routeconfig.region}")
String awsRegion;
英文:
I am trying to get some values from my application.yml
file using the @Value
annotation in a ServiceImpl
class, but variables with @Value
annotation always stay NULL
for some reason. Can someone please help me in fetching the values from the application.yml
file using @Value
annotation?
This is what is present in my application.yml
file
aws:
routeconfig:
rolearn: myrolearn
bucketname: mybucket
region: ap-southeast-1
These are the variables with @Value
annotation which are always NULL
@Value("${aws.routeconfig.rolearn}")
String routeConfigRoleArn;
@Value("${aws.routeconfig.bucketname}")
String bucketName;
@Value("${aws.routeconfig.region}")
String awsRegion;
答案1
得分: 1
我认为你的 yml 文件是不正确的。
aws:
routeconfig: rolearn
bucketname: mybucket
region: ap-southeast-1
你正在将 bucketname
和 region
引用放在 routeconfig
属性的父对象下。
如果你想引用 aws
下的所有值,应该像这样:
aws:
routeconfig: rolearn
bucketname: mybucket
region: ap-southeast-1
然后你的 @Value
注解应该可以工作。
你也可以像这样配置一个属性类并注入它:
@Component
@ConfigurationProperties(prefix = "aws")
public class AwsConfig {
private String routeConfig;
private String bucketName;
private String region;
// getters and setters
}
然后,你可以注入 AwsConfig
类并检索相应的属性,而不是使用 @Value
:
@Autowired
AwsConfig awsConfig;
awsConfig.getRouteConfig();
awsConfig.getBucketName();
awsConfig.getRegion();
在需要的地方使用。
英文:
I think your yml is incorrect.
aws:
routeconfig: rolearn
bucketname: mybucket
region: ap-southeast-1
You are referencing bucketname and region under a parent object of routeconfig property.
If you want to reference all the values under aws
, it should be like so:
aws:
routeconfig: rolearn
bucketname: mybucket
region: ap-southeast-1
Then your @Value
annotation should work.
You can also configure a property class like so and inject it:
@Component
@ConfigurationProperties(prefix = "aws")
public class AwsConfig {
private String routeConfig;
private String bucketName;
private String region;
// getters and setter
}
Then instead of using @Value
you can inject the AwsConfig class and retrieve the corresponding properties:
AwsConfig awsConfig;
awsConfig.getRouteConfig();
awsConfig.getBucketName();
awsConfig.getRegion()
wherever needed.
答案2
得分: 0
你能尝试按照以下方式格式化你的 YAML 吗:
aws:
routeconfig:
rolearn: myrole
bucketname: mybucket
region: ap-southeast-1
同时,请确保缩进只使用两个空格,不要使用制表符。
英文:
Can you try formatting your yaml like this:
aws:
routeconfig:
rolearn: myrole
bucketname: mybucket
region: ap-southeast-1
Also, make sure you have only two spaces for indention and no tabs.
答案3
得分: 0
你检查是否做错了什么。
在 application.yml 中没有问题。
从 application.yml 文件中加载属性。对我有效:
@Controller
public class Sample {
@Value("${aws.routeconfig.rolearn}")
String routeConfigRoleArn;
@Value("${aws.routeconfig.bucketname}")
String bucketName;
@Value("${aws.routeconfig.region}")
String awsRegion;
@GetMapping("/test")
public void load() {
System.out.println(routeConfigRoleArn);
System.out.println(bucketName);
System.out.println(awsRegion);
}
}
控制台输出:
myrolearn
mybucket
ap-southeast-1
如果你仍然无法解决,可以尝试下面的解决方案:
你可以这样加载属性。
创建一个自定义类来加载自定义属性。例如:
@Component
@ConfigurationProperties(prefix = "aws")
public class AWSProps {
private Map<String, String> routeconfig;
public Map<String, String> getRouteconfig() {
return routeconfig;
}
public void setRouteconfig(Map<String, String> routeconfig) {
this.routeconfig = routeconfig;
}
@Override
public String toString() {
return "AWSProps [routeconfig=" + routeconfig + "]";
}
}
在 pom.xml 中添加这个依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
现在进行测试,只需创建示例控制器:
@Controller
public class Sample {
@Autowired
private AWSProps props;
@GetMapping("/test")
public void load() {
System.out.println(props);
}
}
输出:AWSProps [routeconfig={rolearn=myrolearn, bucketname=mybucket, region=ap-southeast-1}]
英文:
You check if you are doing something wrong.
There is no issue in application.yml.
aws:
routeconfig:
rolearn: myrolearn
bucketname: mybucket
region: ap-southeast-1
Properties are loaded from application.yml file. It's working for me :
@Controller
public class Sample {
@Value("${aws.routeconfig.rolearn}")
String routeConfigRoleArn;
@Value("${aws.routeconfig.bucketname}")
String bucketName;
@Value("${aws.routeconfig.region}")
String awsRegion;
@GetMapping("/test")
public void load() {
System.out.println(routeConfigRoleArn);
System.out.println(bucketName);
System.out.println(awsRegion);
}
}
Output on console :
myrolearn
mybucket
ap-southeast-1
If you are still not able to solve, then you can go for this solution below :
You can do in this way to load properties.
Create a custom class so as to load custom properties. For example:
@Component
@ConfigurationProperties(prefix = "aws")
public class AWSProps {
private Map<String, String> routeconfig;
public Map<String, String> getRouteconfig() {
return routeconfig;
}
public void setRouteconfig(Map<String, String> routeconfig) {
this.routeconfig = routeconfig;
}
@Override
public String toString() {
return "AWSProps [routeconfig=" + routeconfig + "]";
}
}
In the pom.xml, add this dependency :
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
Now to test, just create sample controller :
@Controller
public class Sample {
@Autowired
private AWSProps props;
@GetMapping("/test")
public void load() {
System.out.println(props);
}
}
Output : AWSProps [routeconfig={rolearn=myrolearn, bucketname=mybucket, region=ap-southeast-1}]
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论