2012-11-01 17 views
6

Próbuję odczytać właściwości z pliku właściwości, którego nazwa będzie inna dla każdego z naszych środowisk, takich jak local.properties, dev. właściwości, itp. Te pliki właściwości będą zawierać tylko informacje o połączeniu dla odpowiednich instancji mongodb, takich jak host, port i dbname. Zwykle tego rodzaju rzeczy byłyby wykonywane z definicją JNDI na naszym serwerze aplikacji, ale obecnie nie ma żadnych implementacji tego dla Mongo.Spring 3.1 contextInitializerClasses nie działa w WebLogic 10.3.6 przy użyciu web.xml Context-Param

Odkąd używam WebLogic 10.3.6, nie mogę używać specyfikacji Servlet 3.0 i dlatego nie mogę używać konfiguracji Java dla Spring, obecnie tylko XML. Tak więc podejście, które próbuję użyć, to zdefiniowanie kontekstowego parametru contextInitializerClass w moim pliku web.xml, a następnie ustawienie go w klasie implementującej ApplicationContextInitializer i ustawia ręcznie aktywny profil Spring. Jednak przy uruchamianiu WebLogic lub przy redeploy, żadne z nich nie wywołuje mojej niestandardowej klasy inicjalizacyjnej, a mój profil nie jest ustawiany.

Moje pytanie to, czy kontekst SpringInitializerClass ma zależność od Servlet 3.0, czy jest coś innego, czego mi brakuje?

kodu, który zdefiniowaliśmy:

web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 

<context-param> 
    <param-name>contextInitializerClass</param-name> 
    <param-value>com.myapp.spring.SpringContextProfileInit</param-value> 
</context-param> 

<!-- Location of spring context config --> 
<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value> 
</context-param> 
<servlet> 
    <servlet-name>appServlet</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet>  
... 

SpringContextProfileInit.java

public class SpringContextProfileInit implements ApplicationContextInitializer<ConfigurableWebApplicationContext> { 

    private static final Logger log = LoggerFactory.getLogger(SpringContextProfileInit.class); 

    public SpringContextProfileInit() { 
     log.debug("Got the constructor"); 
    } 

    @Override 
    public void initialize(ConfigurableWebApplicationContext ctx) { 
     ConfigurableWebEnvironment environ = ctx.getEnvironment(); 
     log.debug("Got the environment, no profiles should be set: "+ environ.getActiveProfiles()); 

     /* 
     * Here I am setting the profile with a hardcoded name. In the real app, 
     * I would read from a separate properties file, always named app.properties 
     * which would live on the app server's classpath. That app.properties file 
     * would contain a property directing the Spring Profile to use. 
     */ 
     environ.setActiveProfiles("local"); 
     log.debug("Now should be set to local: "+ environ.getActiveProfiles()); 
     ctx.refresh(); 
    } 

} 

servlet-context.xml

<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:mvc="http://www.springframework.org/schema/mvc" 
xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:mongo="http://www.springframework.org/schema/data/mongo" 
    xmlns:c="http://www.springframework.org/schema/c" 
xmlns:p="http://www.springframework.org/schema/p" 
xmlns:jpa="http://www.springframework.org/schema/data/jpa" 
xmlns:cache="http://www.springframework.org/schema/cache" 
xmlns:aop="http://www.springframework.org/schema/aop" 
xmlns:util="http://www.springframework.org/schema/util" 
xsi:schemaLocation=" 
    http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd 
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd 
http://www.springframework.org/schema/data/mongo 
http://www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsd 
    http://www.springframework.org/schema/data/jpa 
    http://www.springframework.org/schema/data/jpa/spring-jpa.xsd 
    http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd 
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd 
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd"> 
<context:property-placeholder properties-ref="deployProperties" /> 
... 
<beans profile="local"> 
    <bean id="deployProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean" 
      p:location="WEB-INF/local.properties" /> 
</beans> 
<beans profile="beast, dev"> 
    <bean id="deployProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean" 
      p:location="WEB-INF/dev.properties" /> 
</beans> 
</beans> 

Kiedy próbuję wdrożyć aplikację, pojawia się wyjątek: NoSuchBeanDefinitionException:No bean named 'deployProperties' is defined który byłby oczekiwany jeśli profil nie jest ustawiony. Moje dzienniki nie pokazują, że którekolwiek z moich instrukcji debugowania są drukowane. Próbowałem również przeniesienie parametru contextInitializerClass do init-param mojego DispatcherServlet, ale dało to takie same wyniki.

Kim są ograniczenia, które

  1. nie mogę ustawić profil od wewnątrz moje skrypty Mavena ponieważ nasz firma wykorzystuje ten sam artefakt pchnąć do wszystkich środowiskach.

  2. Nie mogę również zmienić wersji WebLogic lub użyć najnowszej specyfikacji servletu , ponieważ jest zależna od kontenera.

Moje obecne wersje są:

  • Wiosna 3.1.2.RELEASE
  • WebLogic 10.3.6
  • javax.servlet-api 2,5

Czy ktoś widział ten problem i wie, w jaki sposób mogę załadować moją klasę inicjalizującą? Czy istnieje lepszy sposób na robienie tego, co próbuję zrobić?

Wygląda to związane z innym plakatu pytanie, które nie zostało odebrane: Spring MVC 3.1 Using Profiles for environment specific Hibernate settings

Odpowiedz

6

Nazwa kontekstu param to myślę, że nie tak powinno być contextInitializerClasses nie contextInitializerClass, który mógłby być powód dlaczego ApplicationContextInitializer jest nie uzyskiwanie zabierani

Ponadto wydaje się, że brakuje wpisu dla ContextLoaderListener w pliku web.xml, warto dodać, że zbyt:

<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 

To jest ten, który ładuje plik XML xml konfiguracji określonej w znaczniku contextConfigLocation

+0

Cóż, to jest krępujące, masz rację co do nazwy, musi to być * Klasy. Dzięki za pomoc. –