javaspringtemplatesspring-elproperty-injection

Evaluate properties in Spring's context.xml (basic templating)


I'm wondering whether it is possible to evaluate properties in Spring's xml configuration files. I'm currently already injecting properties using a PropertyPlaceholderConfigurer. But what I want to achieve is to inject a value, if a certain property is true, and inject another value, if it is false.

For example I want to set the hibernate property hibernate.hbm2ddl.auto in my persistence.context.xml to validate only, if my custom property com.github.dpeger.jpa.validate is true. I know I can specify defaults like this:

<property name="jpaProperties">
    <map>
        <entry key="hibernate.hbm2ddl.auto" value="${com.github.dpeger.jpa.validate:none}" />
        ...
    </map>
</property>

But is there a possibility to somehow evaluate a properties' value maybe like this:

<property name="jpaProperties">
    <map>
        <entry key="hibernate.hbm2ddl.auto" value="${com.github.dpeger.jpa.validate?validate:none}" />
        ...
    </map>
</property>

Solution

  • First option:

    You can use #{} EL expression and insert ${} placeholder right into this expression:

    <property name="jpaProperties">
        <map>
            <entry key="hibernate.hbm2ddl.auto" 
                value="#{${com.github.dpeger.jpa.validate}?'validate':'none'}" />
            ...
        </map>
    </property>
    

    Second option:

    You can create separate property bean (note, that you have to define xmlns:util namespace and spring-util.xsd location):

    <beans ...
        xmlns:util="http://www.springframework.org/schema/util"
        xsi:schemaLocation="...
            http://www.springframework.org/schema/util
            http://www.springframework.org/schema/util/spring-util.xsd">
    
    
        <util:properties id="props" location="classpath:appliction.properties"/>
    
        ...
    
    </beans>
    

    Now you can use this property bean in the EL expression by id:

    <property name="jpaProperties">
        <map>
            <entry key="hibernate.hbm2ddl.auto" 
                value="#{props['com.github.dpeger.jpa.validate']?'validate':'none'}" />
            ...
        </map>
    </property>