2016-02-03 61 views
0

我正在嘗試在項目之外設置hibernate項目與database.properties文件的配置。嘗試下面設置在web.xml在Hibernate中可以從項目結構的外部訪問database.properties文件嗎?

<context-param> 
     <param-name>propertiesLocation</param-name> 
     <param-value>classpath:resources/database.properties</param-value> 
    </context-param> 

和sdnext-servlet.xml中

<context:property-placeholder location="file:${#{contextParameters.propertiesLocation}" /> <br><br> 

,但未能達到所需的輸出。 仍然高於配置強制將屬性文件置於項目結構中可以做些什麼以便可以在項目之外訪問?

以下配置對於項目內的database.properties文件正常工作。 <context:property-placeholder location="classpath:resources/database.properties"/>

需要做什麼修改才能讓項目訪問項目外的database.properties文件。

web.xml文件

<servlet> 
     <servlet-name>sdnext</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <init-param> 
      <param-name>contextConfigLocation</param-name> 
      <param-value>/WEB-INF/config/sdnext-servlet.xml</param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>sdnext</servlet-name> 
     <url-pattern>*.html</url-pattern> 
    </servlet-mapping> 

    <welcome-file-list> 
     <welcome-file>index.html</welcome-file> 
    </welcome-file-list> 

sdnext-servlet.xml中是

<context:property-placeholder location="classpath:resources/database.properties"/> 
    <context:component-scan base-package="com.dineshonjava" /> 
    <tx:annotation-driven transaction-manager="hibernateTransactionManager" /> 

    <bean id="jspViewResolver" 
     class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <property name="viewClass" 
      value="org.springframework.web.servlet.view.JstlView" /> 
     <property name="prefix" value="/WEB-INF/views/" /> 
     <property name="suffix" value=".jsp" /> 
    </bean> 

    <bean id="dataSource" 
     class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
     <property name="driverClassName" value="${database.driver}" /> 
     <property name="url" value="${database.url}" /> 
     <property name="username" value="${database.user}" /> 
     <property name="password" value="${database.password}" /> 
    </bean> 

    <bean id="sessionFactory" 
     class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
     <property name="dataSource" ref="dataSource" /> 
     <property name="annotatedClasses"> 
      <list> 
       <value>com.dineshonjava.model.Employee</value> 
       <value>com.dineshonjava.model.Books</value> 
      </list> 
     </property> 
     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.dialect">${hibernate.dialect}</prop> 
       <prop key="hibernate.show_sql">${hibernate.show_sql}</prop> 
       <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop> 
      </props> 
     </property> 
    </bean> 

    <bean id="hibernateTransactionManager" 
     class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
     <property name="sessionFactory" ref="sessionFactory" /> 
    </bean> 
+0

你有沒有嘗試給你的'位置'屬性文件的絕對路徑? – user2004685

+0

@ user2004685是的我試過這樣的所以它的工作。但我正在嘗試這樣做,以便它不應該在任何文件中進行硬編碼。可能嗎? – Sonal

+0

'file:$ {#{contextParameters.propertiesLocation}'在這裏你並沒有結束'}'。這是一個錯字嗎? – user2004685

回答

1

至於說,它沒有任何關係與Hibernate和Spring在內另一個框架。這與你對佔位符(處理)和Spring EL的誤解有關。

您正在嘗試使用佔位符配置<context:property-placeholder />。現在關於這一點,您在基礎結構之前使用佔位符來完全解析這些佔位符實際已經到位。

如果你真的想用動態的方式來設置配置,你將不得不求助於使用Spring EL。你實際上必須做編程xml類的東西。

您將需要使用environment變量來解析來自已知位置的變量,如系統環境,系統屬性,jndi,servlet上下文等。使用getRequiredProperty(...)方法來解析該值。

<context:property-placeholder location="#{environment.getRequiredProperty('propertiesLocation')}" /> 

注:這將無法正常工作的location屬性是不知道的EL。改爲使用普通的PropertySourcesPlaceholderConfigurer

<bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer"> 
    <property name="location" value="#{environment.getRequiredProperty('propertiesLocation')}" /> 
</bean> 

現在,您需要定義一個名爲propertiesLocation某處財產,這可以是(根據環境的環境和可能性)。

  • 系統環境變量
  • 系統屬性(Java -D)
  • Servlet上下文參數
  • 的Servlet初始化參數
  • JNDI

你的情況,你想使用的上下文param

<context-param> 
    <param-name>propertiesLocation</param-name> 
    <param-value>classpath:resources/database.properties</param-value> 
</context-param> 

現在,而不是classpath:resources/database.properties使用其他類似file:/some/path/on/your/system/database.properties。有關支持的前綴的更多信息,請參閱resource loading上的參考指南。

但是,您可能更適合使用JNDI條目的系統環境變量,因爲它仍然非常靜態,您最好直接指定location="file:/some/path/on/your/system/database.properties

+0

感謝您的努力。但在做完所有你提到的改變之後,它仍然不適合我。 – Sonal

+0

什麼不起作用?如果該屬性不在那裏,你應該得到一個異常,如果它確實解析爲'null'或'''''它應該加載文件。如果發生這種情況,您的文件不包含所需的佔位符。 –

+0

java.io.FileNotFoundException:無法打開ServletContext資源[/#{environment.getRequiredProperty('propertiesLocation')}] – Sonal

0

file:${#{contextParameters.propertiesLocation}看到一個錯字,你不與}結束屬性。

試試這個:

<context:property-placeholder location="file:#{contextParameters.propertiesLocation}"/>

+0

謝謝你的回覆。但是這個解決方案在我的情況下不起作用 – Sonal

+0

什麼是錯誤? – user2004685

+0

SEVERE:爲servlet sdnext分配異常 java.io.FileNotFoundException:/${contextParameters.propertiesLocation}(沒有這樣的文件或目錄) – Sonal

1

繼@ user2004685建議,如果給的絕對路徑的性質location工程文件,然後你可以通過定義一個Maven資源,其中包含的文件路徑超過硬編碼問題,那就是在您的項目取代建造週期。

+0

我也試過這個。感謝您的建議。 – Sonal

相關問題