2016-08-24 21 views
0

我原本有一個xml文件與下面這種佈局:豆類使用配置文件後未找到 - 不知道爲什麼

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:util="http://www.springframework.org/schema/util" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd 
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> 

    <bean id="FirstBean">...</bean> 
    <bean id="SecondBean">...</bean> 
    <bean id="ThirdBean">...</bean> 
</beans> 

這對我們運作良好。但是今天我們意識到我們只想在某些環境(生產和測試)中實例化一些bean,並且我們需要配置文件才能實現它。我們這樣做是通過嵌套一些元素,並添加配置文件,如下所示:

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:util="http://www.springframework.org/schema/util" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd 
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> 

    <!-- Beans to run commonly amongst both profiles --> 
    <beans> 
     <bean id="FirstBean">...</bean> 
    </beans> 

    <!-- Beans to run in prod --> 
    <beans profile="production"> 
     <bean id="SecondBean">...</bean> 
    </beans> 

    <!-- Beans to run in test --> 
    <beans profile="test"> 
     <bean id="ThirdBean">...</bean> 
    </beans> 
</beans> 

然後......爲了讓豆加載正確的豆類 - 在應用程序的初始啓動 - 我執行以下(目前硬編碼用於測試目的):

System.setProperty("spring.profiles.active", "test"); 

我也曾嘗試:

System.setProperty("spring.profiles.active", "production"); 

但現在我不斷收到「沒有這樣的bean定義」在所有三個豆。

我希望我在這裏提供了足夠的信息。我真的被困在此 - 已經遵循各種在線資源。

+0

信息太少,只有片段,並沒有概述。如果您在啓動時嘗試在某個bean中執行該操作,那麼您何時/在哪裏設置了這些屬性,這就太遲了。 –

回答

0

看起來你需要在你的應用程序啓動時早些時候設置一個活動的Spring配置文件。有幾種不同的方法來實現這一點。

快速解決方案

出於測試目的,你可以一個的context-param添加到web.xml中:

<!DOCTYPE web-app PUBLIC 
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" 
"http://java.sun.com/dtd/web-app_2_3.dtd" > 

<web-app> 
    <display-name>Spring Web Application</display-name> 
    <servlet> 
     <servlet-name>spring</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>spring</servlet-name> 
     <url-pattern>/spring/*</url-pattern> 
    </servlet-mapping> 
    <!-- Set active Spring profile --> 
    <context-param> 
     <param-name>spring.profiles.active</param-name> 
     <param-value>prod</param-value> 
    </context-param> 
</web-app> 

程序化解決方案

您可以通過編程設置一個有效的春天輪廓在啓動時將實現ApplicationContextInitializer的自定義類傳遞給DispatcherServlet。在您的自定義類中添加一個方法,該方法使用爲應用程序上下文設置活動的Spring配置文件的代碼覆蓋ApplicationContextInitializer的initialize方法。

在web.xml中傳遞實現ApplicationContextInitializer您的自定義類DispatcherServlet會作爲一個init-PARAM:

<!DOCTYPE web-app PUBLIC 
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" 
"http://java.sun.com/dtd/web-app_2_3.dtd" > 

<web-app> 
<display-name>Spring Web Application</display-name> 
    <servlet> 
     <servlet-name>spring</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <init-param> 
      <!-- Register custom class that implements ApplicationContextInitilizer to set active Spring profile on startup --> 
     <param-name>contextInitializerClasses</param-name> 
     <param-value>org.eclipse.che.examples.MyApplicationContextInitializer</param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>spring</servlet-name> 
     <url-pattern>/spring/*</url-pattern> 
    </servlet-mapping> 

</web-app> 

然後定義實現ApplicationContextInitializer您的自定義類:

package org.eclipse.che.examples; 

import org.springframework.context.ApplicationContextInitializer; 
import org.springframework.context.ConfigurableApplicationContext; 

public class MyApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> { 

    @Override 
    public void initialize(ConfigurableApplicationContext applicationContext) { 
     // set active Spring profile 
     applicationContext.getEnvironment().setActiveProfiles("prod"); 
    } 

} 
相關問題