org.springframework.beans.notwritablepropertyexception无效属性< blah>不可写或具有无效的setter方法

2eafrhcq  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(407)

我有从我的项目的源代码中删除所有密码和加密密钥的要求。我正在努力让这个在spring-servlet.xml文件中工作。在我尝试做出改变之前,这个方法很有效:
数据库用户名、加密密码、url和驱动程序在文件jdbc\u server.properties中定义为类路径资源。
加密/解密密钥在启动时作为-dencryption\u密码传递=
我想将jdbc\u server\u属性文件移到文件系统中,并在文件中包含密钥。
这是我最后一次(至少25次)尝试让它工作。

<bean id="propertyConfigurer" class="org.jasypt.spring4.properties.EncryptablePropertyPlaceholderConfigurer">
        <constructor-arg ref="standardEncryptor" />
        <property name="jdbcUsername" value="JDBC_USERNAME" />
        <property name="jdbcPassword" value="JDBC_PASSWORD" />
        <property name="jdbcUrl" value="JDBC_URL" />
        <property name="jdbcDriver" value="JDBC_DRIVER" />
        <property name="locations">
            <list>
                <value>file:///${USERPROFILE}/credentials/jdbc_server.properties</value>
            </list>
        </property>
</bean>

<bean id="standardEncryptor" class="org.jasypt.encryption.pbe.StandardPBEStringEncryptor">
        <property name="config" ref="environmentVariablesConfiguration" />
</bean>

<bean id="environmentVariablesConfiguration" class="org.jasypt.encryption.pbe.config.EnvironmentStringPBEConfig">
        <property name="algorithm" value="PBEWithMD5AndDES" />
        <property name="passwordSysPropertyName" value="ENCRYPTION_PASSWORD" />
</bean>

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close" p:driverClassName="${jdbcDriver}" p:url="${jdbcUrl}"
        p:username="${jdbcUsername}" p:password="${jdbcPassword}">
</bean>

使用上面的配置,我得到一个notwritablepropertyexception异常。关于这个问题,我已经看到了很多帖子,但是没有看到文件系统中的属性和加密密钥都在一个文件中。当这个工作时,属性是从类路径中的一个文件中读取的,jdbcustomer(或其他属性)没有getter/setter,所以我不知道为什么它现在会以这种方式失败。
我尝试将getter和setter(作为字符串)添加到我的basedaoimpl类中,但是我仍然得到相同的错误,因此如果我要添加它们,我不确定它们会去哪里。

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'propertyConfigurer' defined in ServletContext resource [/WEB-INF/spring-servlet.xml]: Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property 'jdbcUsername' of bean class [org.jasypt.spring4.properties.EncryptablePropertyPlaceholderConfigurer]: Bean property 'jdbcUsername' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1568)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1276)
    at ...
1aaf6o9v

1aaf6o9v1#

那可能是因为 jdbcUsername 不属于 EncryptablePropertyPlaceholderConfigurer .
请尝试这样的方法(只需移除 jdbc* 来自 EncryptablePropertyPlaceholderConfigurer 配置,并直接在 dataSource 豆子):

<bean id="propertyConfigurer" class="org.jasypt.spring4.properties.EncryptablePropertyPlaceholderConfigurer">
        <constructor-arg ref="standardEncryptor" />
        <property name="locations">
            <list>
                <value>file:///${USERPROFILE}/credentials/jdbc_server.properties</value>
            </list>
        </property>
</bean>

<bean id="standardEncryptor" class="org.jasypt.encryption.pbe.StandardPBEStringEncryptor">
        <property name="config" ref="environmentVariablesConfiguration" />
</bean>

<bean id="environmentVariablesConfiguration" class="org.jasypt.encryption.pbe.config.EnvironmentStringPBEConfig">
        <property name="algorithm" value="PBEWithMD5AndDES" />
        <property name="passwordSysPropertyName" value="ENCRYPTION_PASSWORD" />
</bean>

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close" p:driverClassName="${JDBC_DRIVER}" p:url="${JDBC_URL}"
        p:username="${JDBC_USERNAME}" p:password="${JDBC_PASSWORD}">
</bean>

假设你 jdbc_server.properties 文件包含所需信息:

JDBC_USERNAME=ENC(...)
JDBC_PASSWORD=ENC(...)
JDBC_URL=ENC(...)
JDBC_DRIVER=your.jdbc.driver

相关问题