我对Spring注入和Web服务的世界还很陌生。到目前为止,我已经开发了一些简单的SOAP和REST服务,使用属性文件将依赖于已部署服务器(DEV v.QA v.PROD)的变量(例如用户名和密码)注入到bean中。现在我们尝试使用VisualParadigm工具自动生成代码的数据库部分。突然我发现用户名/密码/等。数据库的值不在applicationContext.xml文件中,而是位于src / main / java / ormmapping目录中的project.cfg.xml文件中。内容:
<hibernate-configuration>
<session-factory>
<!-- properties -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/customer</property>
<property name="connection.username">{database.username}</property>
<property name="connection.password">{database.password}</property>
<property name="hibernate.connection.provider_class">org.hibernate.service.jdbc.connections.internal.C3P0ConnectionProvider</property>
<property name="hibernate.c3p0.acquire_increment">1</property>
<property name="hibernate.c3p0.idle_test_period">0</property>
<property name="hibernate.c3p0.min_size">1</property>
<property name="hibernate.c3p0.max_size">15</property>
<property name="hibernate.c3p0.timeout">0</property>
<property name="show_sql">false</property>
<property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>
<!-- mapping files -->
</session-factory>
</hibernate-configuration>
我在哪里看到xml元素
<property name="connection.username">root</property>
我尝试用$ {database.username}替换root,后者引用我指定的.properties文件中的属性。日志的结果是用户名现在设置为null。
我正在使用CXF和Maven。我相信一定要找到属性文件;我可以从STS控制台看到它从同一目录加载log4j.xml,它们都是从web.xml引用的。有没有办法将project.cfg.xml中的值从硬编码更改为注入? [该文件是由VP提供的.jar文件引用的,它将VP生成的代码与hibernate代码连接起来。我希望不必修改这样的供应商提供的库。]
答案 0 :(得分:2)
一种可能的解决方案是将hibernate配置移动到spring,在那里你可以使用属性,就像你用于其他常规spring bean一样。以下示例取自documentation:
<beans>
<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="org.hsqldb.jdbcDriver"/>
<property name="url" value="jdbc:hsqldb:hsql://localhost:9001"/>
<property name="username" value="${database.username}"/>
<property name="password" value="${database.password}"/>
</bean>
<bean id="mySessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="myDataSource"/>
<property name="mappingResources">
<list>
<value>product.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<value>
hibernate.dialect=org.hibernate.dialect.HSQLDialect
</value>
</property>
</bean>
</beans>
答案 1 :(得分:1)
一个简单的解决方案是从外部文件导入部署变量。我无法让XInclude工作;由于hibernate.cfg.xml文件是由DTD规范控制的,因此<xi:include>
行的任何添加都必须符合规范&#39;错误,我无法弄清楚是否允许我正确修改DTD。但是,使用ENTITY替换工作。在DOCTYPE声明中,添加ENTITY以指定外部文件:
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"
[ <!ENTITY xinclude SYSTEM "/etc/comporium/com.comporium.customermodel.webservices/hibernate.xml"> ]>
然后用一个&xinclude;
-
<hibernate-configuration>
<session-factory>
<!-- properties -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
&xinclude;
<property name="show_sql">false</property>
<property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>
<!-- mapping files -->
</session-factory>
</hibernate-configuration>
然后将正确的部署文件放在/ etc目录中。它不是“格式良好”。 xml,没有开放元素 - 它只包含<property>
个元素。