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
nie mogę ustawić profil od wewnątrz moje skrypty Mavena ponieważ nasz firma wykorzystuje ten sam artefakt pchnąć do wszystkich środowiskach.
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
Cóż, to jest krępujące, masz rację co do nazwy, musi to być * Klasy. Dzięki za pomoc. –