@Value Annotation和数据库PropertyPlaceHolderConfigurer

时间:2016-11-08 09:57:13

标签: java spring

我的Spring XML中有两个PropertyPlaceHolderConfigurer。第一个从文件中获取应用程序属性。第二个从数据库获取用户属性,如下所示:

<myConfiguration>
<bean id="databaseProperties"
            class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
            <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
            <property name="properties">

                <bean class="org.apache.commons.configuration.ConfigurationConverter"
                    factory-method="getProperties">
                    <constructor-arg>
                        <ref bean="propertiesSource" />
                    </constructor-arg>
                </bean>
            </property>
        </bean>

        <bean id="propertiesSource" class="org.apache.commons.configuration.DatabaseConfiguration">
            <constructor-arg type="javax.sql.DataSource" ref="tomcatDataSource" />
            <constructor-arg value="application_properties" />
            <constructor-arg value="PROPERTY_KEY" />
            <constructor-arg value="PROPERTY_VALUE" />
        </bean>

        <bean id="propertiesService" class="com.xxx.PropertiesServiceImpl">
            <property name="propertiesSource" ref="propertiesSource"></property>
        </bean>
<myConfiguration>

它工作正常,我可以访问这些属性注入&#39; propertiesService&#39;像:

@Autowired
private PropertiesService propertiesService;

这是:

public class PropertiesServiceImpl implements PropertiesService {

    @Autowired
    private DatabaseConfiguration propertiesSource;


    private Properties properties;

    @Override
    public String getProperty(String key) {
        if (properties == null) {
            properties = ConfigurationConverter.getProperties(propertiesSource);
        }
        return properties.getProperty(key);
    }


    @Override
    public Properties getProperties() {
        if (properties == null) {
            properties = ConfigurationConverter.getProperties(propertiesSource);
        }
        return properties;
    }

问题是我喜欢使用@Value注释,但它不起作用。

我试过了:

private @Value("#{propertiesService.helloWorld}") String helloWorld;

当然,该属性存在,并且可以通过&#39; propertiesService&#39;但它会导致下一个错误:

Caused by: org.springframework.expression.spel.SpelEvaluationException: EL1008E:(pos 18): Property or field 'helloWorld' cannot be found on object of type 'com.infraportal.model.properties.PropertiesServiceImpl' - maybe not public?
    at org.springframework.expression.spel.ast.PropertyOrFieldReference.readProperty(PropertyOrFieldReference.java:224)
    at org.springframework.expression.spel.ast.PropertyOrFieldReference.getValueInternal(PropertyOrFieldReference.java:94)
    at org.springframework.expression.spel.ast.PropertyOrFieldReference.access$000(PropertyOrFieldReference.java:46)
    at org.springframework.expression.spel.ast.PropertyOrFieldReference$AccessorLValue.getValue(PropertyOrFieldReference.java:374)
    at org.springframework.expression.spel.ast.CompoundExpression.getValueInternal(CompoundExpression.java:88)
    at org.springframework.expression.spel.ast.SpelNodeImpl.getValue(SpelNodeImpl.java:120)
    at org.springframework.expression.spel.standard.SpelExpression.getValue(SpelExpression.java:242)
    at org.springframework.context.expression.StandardBeanExpressionResolver.evaluate(StandardBeanExpressionResolver.java:161)

这让我觉得Spring正在寻找一个&#39; getHelloWorld()&#39;方法改为使用&#39; getProperty(String key)&#39;

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

您需要在EL中引用的bean上显式指定要调用的方法,并提供参数值,如下所示

Msg 156, Level 15, State 1, Line 1
Incorrect syntax near the keyword 'Order'.
Msg 102, Level 15, State 1, Line 9
Incorrect syntax near ')'.

答案 1 :(得分:0)

@Value:它用于表达式驱动的依赖注入。 如果你想使用下面的例子。

  

示例代码

@Configuration
@PropertySource("classpath:jdbc.properties")
public class AppConfig {
    @Value("${jdbc.driverClassName}")
         private String driverClassName;
         @Value("${jdbc.url}")
         private String jdbcURL;
         @Value("${jdbc.username}")
         private String username;
         @Value("${jdbc.password}")
         private String password;
.....

..
}