我曾尝试在Google上查找问题,但无法获得解决方案。
我想要实现的目标
请参阅下面的代码,我要做的是将加密密码传递给MethodInvokingBean
,使用com.xxxxxxx.CryptoUtil
解密是使用静态方法decrypt
。
解密后的值会通过masterDBDatasource
注入<property name="password" ref="decryptedDBPassword" />
,但无效。
<bean id="decryptedDBPassword" class="org.springframework.beans.factory.config.MethodInvokingBean">
<property name="targetClass" value="com.xxxxxxx.CryptoUtil"/>
<property name="targetMethod" value="decrypt"/>
<property name="arguments" value="${encrypted.db.password}" />
</bean>
<bean id="masterDBDatasource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${db.driver.class}" />
<property name="url" value="${db.url}" />
<property name="username" value="${db.username}" />
<property name="password" ref="decryptedDBPassword" />
</bean>
异常
org.springframework.beans.ConversionNotSupportedException: Failed to convert property value of type 'org.springframework.beans.factory.config.MethodInvokingBean' to required type 'java.lang.String' for property 'password'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [org.springframework.beans.factory.config.MethodInvokingBean] to required type [java.lang.String] for property 'password': no matching editors or conversion strategy found
我按照以下教程作为参考
https://www.mkyong.com/spring/spring-methodinvokingfactorybean-example/
我也试过<property name="password" value="decryptedDBPassword" />
但数据库连接正在说 - 由于密码无效而拒绝访问。
请帮助。
答案 0 :(得分:2)
发布我的问题代码的确切答案,作为可能面临类似问题的其他人的参考。
来自@Matt的提示,我使用SPeL进行如下最终配置(不使用MethodInvokingBean
)
<bean id="masterDBDatasource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${db.driver.class}" />
<property name="url" value="${db.url}" />
<property name="username" value="${db.username}" />
<property name="password" value='#{T(com.xxxxxxx.CryptoUtil).decrypt("${encrypted.db.password}")}' />
</bean>
答案 1 :(得分:1)
属性password
应该是String值。您正在将bean(decryptedPassword
)引用传递给期望String作为密码的DriverManagerDataSource
。它应该像
<property name="password" value="${db.password} />
与您提供的username
类似。
由于您需要传递解密的密码,您可能需要查看Spring的表达式支持,这样您就可以在传递密码之前处理密码。
http://docs.spring.io/spring/docs/3.0.0.M3/spring-framework-reference/html/ch07s04.html