Spring MethodInvokingBean - DriverManagerDataSource不接受返回的值

时间:2016-08-01 03:32:09

标签: java spring

我曾尝试在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" /> 但数据库连接正在说 - 由于密码无效而拒绝访问。

请帮助。

2 个答案:

答案 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