我在读取环境变量和满足SonarLint(检测并修复质量问题)的同时遇到了问题。这样它就不起作用了,我的变量为null
private String accessKey;
@Value("${bws.access.key}")
public void setAccessKey(String ak){
accessKey=ak;
}
将方法更改为static (按照sonarLint的建议)不会对变量continuous起作用
private static String accessKey;
@Value("${bws.access.key}")
public static void setAccessKey(String ak){
accessKey=ak;
}
我发现唯一有效的方法是将实例变量标记为静态,而不是将方法标记为静态
private static String accessKey;
@Value("${bws.access.key}")
public void setAccessKey(String ak){
accessKey=ak;
}
但是sonarLint指出了实例方法不应该写入“静态”字段的问题
这种方式不是让我的环境变量跨越边界,而不是正确的吗?
发布于 2018-06-25 22:35:03
您可以使用以下代码:
一个Configuration类(使用@Component
注释,以便由Spring拾取),它将保存来自属性文件的值,在该文件中,您可以将bws.access.key
的值直接绑定到属性。如果你需要accessKey
的访问器方法,你可以直接创建它们(setAccessKey
和getAccessKey
)
@Component
public class ConfigClass {
// @Value("${bws.access.key:<no-value>}") // <- you can use it this way if you want a default value if the property is not found
@Value("${bws.access.key}") // <- Notice how the property is being bind here and not upon the method `setAccessKey`
private String accessKey;
// optional, in case you need to change the value of `accessKey` later
public void setAccessKey(String ak){
this.accessKey = ak;
}
public String getAccessKey() {
return this.accessKey;
}
}
有关更多详细信息,请查看此GitHub sample project。
我用以下命令进行了测试
Build #IU-181.5281.24
(Edit)如何在控制器中使用它
一个选项(还有其他选项)可以是为控制器声明一个构造函数(让我们称其为SampleController
),并在其中请求一个ConfigClass
类型的参数。现在,我们将一个相同类型的控制器属性(config
)设置为作为参数接收的值,如下所示:
@RestController
public class SampleController {
private final ConfigClass config;
public SampleController(ConfigClass configClass) { // <- request the object of type ConfigClass
this.config = configClass; // <- set the value for later usage
}
@RequestMapping(value = "test")
public String test() {
return config.getAccessKey(); // <- use the object of type ConfigClass
}
}
现在,Spring Boot将尝试在ConfigClass
类型的应用程序中找到一个组件(任何类型),因为我们已经定义了一个组件,它会自动将其注入我们的控制器中。这样,您就可以将参数控制器属性config
设置为在configClass
中接收到的值,以供以后使用。
为了测试它,您可以请求url test
。您将看到输出将为anotherValue
。因此,我们可以得出结论,依赖注入机制成功地找到了ConfigClass
的一个实例,并且ConfigClass#getAccessKey
方法工作正常。
https://stackoverflow.com/questions/51024223
复制相似问题