![](/img/trans.png)
[英]How to fill HashMap from java property file with Spring @Value
[英]java spring - override property value received from property file
我有一个场景,我从属性文件中获取编码的密码值。 我有自己的解密实现,所以想从我的 java 类解密密码,然后想进一步使用解密的值,在那里引用。
例如<bean id="myDataSource" class="org.apache.common.dbcp.BasicDataSource" ... // more attributed set from properties like user, hostname etc. p:password="${myPropertey.password}" >
上面的代码我需要实现如下所示的内容,特定于密码属性,因为其余属性很好,但密码需要在使用前解密。
(下面的实现是错误的,但我刚刚提到要给出更多更清晰的想法)
<bean id="myDataSource" class="org.apache.common.dbcp.BasicDataSource" ... // more properties p:password="myDecryptBean.decryptMyPassword(${myPropertey.password})" >
基本上,在用于建立数据库连接之前,我需要解密从属性文件中获取的密码。
感谢您的时间和任何帮助!
您需要创建一个解密密码的自定义数据源对象
<bean id="myDataSource" class="foo.bar.PasswordDecryptingDataSource"
... // more properties
p:encryptedPassword="${myPropertey.password}"
>
像这样实现foo.bar.PasswordDecryptingDataSource
:
public class PasswordDecryptingDataSource extends org.apache.common.dbcp.BasicDataSource {
private myDecryptBean; // inject your decryption bean somehow...
public void setEncryptedPassword(String password) {
super.setPassword(myDecryptBean.decryptMyPassword(password))
}
}
由于您使用的是Spring,我强烈建议您查看PropertyResourceConfigurer
类。 请参阅官方文档 。
特别要看一下convertProperty(String propertyName, String propertyValue)
方法,并考虑创建一个覆盖它的类。 然后,您将能够将自定义解密逻辑添加到overriden方法,该方法将在每次Spring访问该属性时运行。
直接来自文档:
允许从属性资源(即属性文件)配置各个bean属性值。 对自定义配置文件有用...覆盖在应用程序上下文中配置的bean属性。
布莱恩,塞缪尔
非常感谢您的快速帮助,这两种方法都为我的情况提供了解决方案。
我已经实现了扩展PropertyPlaceholderConfigurer,考虑到将来我是否可以获得更多的属性,并且不希望将解密逻辑限制到DataSource。
只是我的2美分代码片段,我已经实现,这可以帮助可能会发现类似情况的人。
<bean class="com.foo.spring.util.PropertyUtil"> <property name="location"> <value>file:${foo.config.location}</value> </property> </bean>
以下是上课
`public class PropertyUtil extends PropertyPlaceholderConfigurer {
@Override
public String convertProperty(String propertyName, String propertyValue){
return super.convertProperty(propertyName, decrypt(propertyValue));
}
private String decrypt(String){
// logical implementation
}
`
我觉得这个线程在这个 PropertyConvertValue 上对我很有帮助。 讨论来源
供快速参考:这是我正在使用的解决方法,如果有人觉得它有帮助:
protected void doProcessProperties(ConfigurableListableBeanFactory beanFactoryToProcess,
final StringValueResolver valueResolver) {
super.doProcessProperties(beanFactoryToProcess,
new StringValueResolver() {
@Override
public String resolveStringValue(String strVal) {
return convertPropertyValue(valueResolver.resolveStringValue(strVal));
}
}
);
}
@Override
protected String convertPropertyValue(String originalValue) {
String value = decrypt(originalValue);
return value;
}
private String decrypt(String value){
//... write decryption logic here
}
类 CustomClass 扩展了 PropertySourcesPlaceholderConfigurer
并覆盖 doProcessProperties(ConfigurableListableBeanFactory beanFactoryToProcess, final StringValueResolver valueResolver)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.