Spring@Value使⽤获取配置信息为null的操作
⼀、项⽬背景
1、介绍:
最近在springboot项⽬中需要做⼀个阿⾥云OSS图⽚上传功能点,将OSS图⽚上传代码提取到公共⼯具类中,为了⽅便其他模块调⽤。
2、问题介绍
在公共⼯具类中使⽤OSS⼀些⾃定义变量信息时会获取不到yml⽂件中定义的OSS参数。
3、问题分析
经过分析确定,公共⼯具类⽅法没有被spring 容器作为bean管理,所以获取不到配置⽂件信息。以前我们经常在controller层以及service层通过@Value获取配置⽂件信息,该层都被spring容器作为bean管理,所以可以轻松获取。
4、问题解决
新建⼀个参数获取类,使⽤@Component注解修饰类。
参见如下代码:
参数初始化:
@Component
public class AliyunOssConstants implements InitializingBean{
/**
* 阿⾥云OSS地域节点
*/
@Value("${dpoint}")
private String endpoint;
/**
* 阿⾥云OSSaccessKeyId
*/
@Value("${aliyunOss.file.keyid}")
private String accessKeyId;
/**
* 阿⾥云OSSaccessKeySecret
*/
@Value("${aliyunOss.file.keysecret}")
private String accessKeySecret;
/**
* 阿⾥云OSSbucket名称
*/
@Value("${aliyunOss.file.bg.bucketname}")
private String bg_bucketname;
/**
* 阿⾥云OSSBucket域名
*/
@Value("${aliyunOss.file.filehost}")
private String filehost;
public static String SPRING_FILE_ENDPOINT;
public static String SPRING_FILE_ACCESS_KEY_ID;
public static String SPRING_FILE_ACCESS_KEY_SECRET;
public static String SPRING_FILE_BG_BUCKET_NAME;
public static String SPRING_FILE_FILE_HOST;
@Override
public void afterPropertiesSet() throws Exception {
SPRING_FILE_ENDPOINT = endpoint;
SPRING_FILE_ACCESS_KEY_ID = accessKeyId;
SPRING_FILE_ACCESS_KEY_SECRET = accessKeySecret;
SPRING_FILE_BG_BUCKET_NAME = bg_bucketname;
SPRING_FILE_FILE_HOST = filehost;
}
}
使⽤参数:
@Slf4j
public class AliyunOSSUtil {
private static String endpoint=AliyunOssConstants.SPRING_FILE_ENDPOINT;
private static String accessKeyId=AliyunOssConstants.SPRING_FILE_ACCESS_KEY_ID;
private static String accessKeySecret=AliyunOssConstants.SPRING_FILE_ACCESS_KEY_SECRET; private static String bucketname=AliyunOssConstants.SPRING_FILE_BG_BUCKET_NAME;
spring怎么读取配置private static String filehost=AliyunOssConstants.SPRING_FILE_FILE_HOST;
// 阿⾥云OSS上传⽂件⽅法
}
@Value取不到值的原因
在springboot中想获取配置⽂件中的值,⼀般的⽅法为
@Value("${tag}")
private String tagValue;
但是取值时,有时这个tagvalue为NULL,可能原因有:
1.类没有加上@Component(或者@service等)
@Component //遗漏
class TestValue{
@Value("${tag}")
private String tagValue;
}
2.类被new新建了实例,⽽没有使⽤@Autowired
@Component
class TestValue{
@Value("${tag}")
private String tagValue;
}
class Test{
...
TestValue testValue = new TestValue()
正确⽅式:
1.使⽤@Autowired注⼊
2.在controller层注值
以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论