我已经为我的应用添加了两个配置文件以及它的外观:
<profiles>
<profile>
<id>dev</id>
<properties>
<db.username>root</db.username>
<db.password>root</db.password>
<db.connectionURL>localhost:3306</db.connectionURL>
<db.driverClass>com.mysql.jdbc.Driver</db.driverClass>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<db.username>prodroot</db.username>
<db.password>prodpass</db.password>
<db.connectionURL>localhost:3306</db.connectionURL>
<db.driverClass>com.mysql.jdbc.Driver</db.driverClass>
</properties>
</profile>
</profiles>
在我的jdbc.properties文件中,我改变了这样的值:
jdbc.driverClassName=${db.driverClass}
jdbc.dialect=org.hibernate.dialect.MySQLDialect
jdbc.databaseurl=jdbc:mysql://${db.connectionURL}/dbname
jdbc.username=${db.username}
jdbc.password=${db.password}
来自spring-container.xml
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"
p:driverClassName="${jdbc.driverClassName}"
p:url="${jdbc.databaseurl}" p:username="${jdbc.username}"
p:password="${jdbc.password}" />
当我尝试部署我的应用程序时出现以下错误:
SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name 'dataSource' defined in ServletContext resource [/WEB-INF/spring-servlet.xml]: Could not resolve placeholder 'db.driverClass'
项目结构:
任何想法我做错了什么? 提前谢谢!
编辑:
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>2.0</version>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/webapp/WEB-INF/</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
答案 0 :(得分:1)
现在你已经设置了它的方式,资源被过滤了,但最终在classpath-root中,在本例中是WEB-INF / classes。
答案 1 :(得分:0)
该错误似乎表明该值未在属性文件中被替换,因为它抱怨db.driverClass
无法解析而不是jdbc.driverClassName
。查看属性文件在构建的artefact中的外观。看起来您没有在Maven中启用资源过滤,或者您忘记激活任何配置文件。
要启用resource filtering,请将此类内容添加到<build>
:
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
这假设您过滤的资源(例如您的jdbc.properties)位于通常的src/main/resources
中,如果目前不是这种情况。我建议你先将所有过滤的资源移到那里,除非你有充分的理由反对它,因为它是迄今为止最简单的设置。确保不要尝试过滤二进制资源(如图像)!了解资源过滤(例如,将占位符转换为实际值)在构建时发生 ,因此您应该能够在生成的WAR中看到替换的值。
看起来像你的Spring中的占位符解析已经配置好了读取属性文件,但为了以防万一,你应该有这样的东西:
<context:property-placeholder location="classpath:/jdbc.properties" ignore-resource-not-found="true"/>
同样,这假设您的jdbc.properties位于类路径根目录中,如果将其放在src/main/resources
中,则会满足,因为它将被复制到WEB-INF/classes
。
您也可以使用其他路径(没有classpath:
前缀),但我发现这是最简单的。了解Spring中的占位符分辨率在运行时发生 ,因此在尝试访问有线值之前,您不会收到错误。