我在调试Jwt插件的时候,突然发现通过@Value注解从properties文件中获取secret值时为null。为了确保密钥的安全性,我们一般把这些都配置在properties文件中,由专人管理。如果把密钥直接写在代码中,凡是参与项目的人员就都知道密钥了,存在一定的风险性。近期我们升级了Springboot框架,却发现如此这样获得的值是null。
获取不到值的代码示例
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class ValueTest {
@Value(value = "${jwt.secret}")
private static String secret;
public static String getSecret(){
return secret;
}
}
测试代码
@RunWith(SpringRunner.class)
@SpringBootTest
class FastWfsApplicationTests {
@Test
public void getValueTest(){
String secret = ValueTest.getSecret();
System.out.println(secret);
}
}
测试结果
解决方案
经过一番百度、文心一言、豆包、通义千问,多数的解答都是说获取值时提前于注入值的时间,所以拿不到值,最后终于有人给出了解决方案,就是通过set方式提前获取到这个属性值。
代码如下:
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class ValueTest {
private static String secret;
@Value(value = "${jwt.secret}")
public void setSecret(String secretValue){
secret = secretValue;
}
public static String getSecret(){
return secret;
}
}
测试结果
虽然问题解决了,但总觉着别扭,这算是曲线救国吗?代码写成这样,感觉很不简洁,而且那个作者也不建议这样用,但是他们提供的其它方法都不行。
有没有其它解决方案的大神,我还是希望用下面的方式,因为我有强迫症,嘻嘻。
@Value(value = "${jwt.secret}")
private static String secret;