finding a property using Spring and Webapp propert

2019-07-18 15:36发布

问题:

This is a "simple" problem and I am seeking both a how-to and/or a you're-dumb-don't-do-that. I am open to both.

I am building a war file and want the structure to be:

WEB-INF/
  properties/
    <my properties files>
  classes/
    ...
  spring/
    <my spring files>

Is that dumb? I know that I can access the properties files though the property-placeholder but I'd rather not nest the properties in the classes section - it doesn't make sense to me.

So the Spring file looks like this:

<context:property-placeholder location="classpath:properties/*.properties" />

if I want to access them in the classes area. I thought that

<context:property-placeholder location="properties/*.properties" />

would let me just put the directory under WEB-INF directly...am I wrong (ps I think I am :) ).

Any advice?

回答1:

This should work

<context:property-placeholder location="WEB-INF/properties/*.properties" />

WEB-INF is not the root of the of the web-app, so you need to add WEB-INF to the path.

spring-context-3.1.xsd

<xsd:attribute name="location" type="xsd:string">
<xsd:annotation>
<xsd:documentation>
<![CDATA[ 
    The location of the properties file to resolve placeholders against, as a Spring
    resource location: a URL, a "classpath:" pseudo URL, or a relative file path.
    Multiple locations may be specified, separated by commas. If neither location nor properties-ref is
    specified, placeholders will be resolved against system properties.


  ]]> 
</xsd:documentation>
</xsd:annotation>
</xsd:attribute>


回答2:

You can't do it the way you want since the classpath for the Classloader will be the /classes directory and any jars in the /lib directory. This is the standard configuration for a war file.

Wars and ears have specific configurations which you have to follow for the files to be valid. If you think about it, it would make it difficult to have different vendors provide web containers that could deploy the same war file if there was no standard format. There is a pretty informative page here.

To achieve something similar to what you want, you can simply have directories of /classes/properties and /classes/spring and look them up appropriately from your classpath ("classpath:properties/myfile.properties).



回答3:

I am not sure what you want to achieve. Here the method I use to inject the properties from a basic properties file to a bean:

In the spring files (XML bean definitions), I add the reference to my property file (myfile.properties):

<bean id="propertyConfigurer"
            class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  <property name="location" value="classpath:myfile.properties" />
</bean> 

and then I add my references to the properties (db.url is the URL address for my database connection, I kept only the bean properties referenced in my property file).

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close">
    <!-- results in a setDriverClassName(String) call -->
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url"><value>${db.url}</value></property>
    <property name="username"><value>${db.login}</value></property>
    <property name="password"><value>${db.password}</value></property>

</bean>

By default, if the property is not defined in the property file, Spring uses the System Properties (this behaviour can be changed).