prod example baeldung active java spring profiles

java - example - spring profiles baeldung



Perfil predeterminado en Spring 3.1 (7)

Acerca de establecer el perfil de producción predeterminado ya publicado @andih

La manera más fácil de configurar el perfil predeterminado para el plugin maven jetty es incluir el siguiente elemento en la configuración del complemento:

<plugin> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> <configuration> <systemProperties> <systemProperty> <name>spring.profiles.active</name> <value>demo</value> </systemProperty> </systemProperties> </configuration> </plugin>

En mi aplicación, he frijoles anotados con @Profile("prod") y @Profile("demo") . El primero, como se puede adivinar :), se usa en beans que se conectan a DB de producción y el segundo anota frijoles que usan algún DB falso ( HashMap o lo que sea) para acelerar el desarrollo.

Lo que me gustaría tener es un perfil predeterminado ( "prod" ) que se usará siempre si no se reemplaza por " something-else ".

Perfecto sería tener en mi web.xml :

<context-param> <param-name>spring.profiles.active</param-name> <param-value>prod</param-value> </context-param>

y luego anular esto con -Dspring.profiles.active="demo" para que yo pueda:

mvn jetty:run -Dspring.profiles.active="demo".

Pero lamentablemente esto no está funcionando. ¿Alguna idea de cómo podría lograr eso? Establecer -Dspring.profiles.active="prod" en todos mis entornos no es una opción.


Defina su entorno de producción como perfil predeterminado en su web.xml

<context-param> <param-name>spring.profiles.default</param-name> <param-value>prod</param-value> </context-param>

y si desea utilizar un perfil diferente, páselo como propiedad del sistema

mvn -Dspring.profiles.active="demo" jetty:run


Mi experiencia es que usar

@Profile("default")

el bean solo se agregará al contexto si no se identifica ningún otro perfil. Si -Dspring.profiles.active="demo" un perfil diferente, por ejemplo, -Dspring.profiles.active="demo" , se ignora este perfil.


Puede configurar su web.xml como recurso filtrado y tener este valor rellenado por maven desde la configuración del perfil de maven: eso es lo que hacemos.

en pom filtra todos los recursos (puedes hacerlo si no tienes $ {} marcado en ellos)

<webResources> <resource> <directory>src/main/webapp</directory> <filtering>true</filtering> </resource> </webResources>

en web.xml puesto

<context-param> <param-name>spring.profiles.active</param-name> <param-value>${spring.prfile}</param-value> </context-param>

en pom crear perfiles de maven

<profiles> <profile> <id>DEFAULT</id> <activation> <activeByDefault>true</activeByDefault> </activation> <properties> <spring.profile>prod</spring.profile> </properties> <profile> <profile> <id>DEMO</id> <properties> <spring.profile>demo</spring.profile> </properties> <profile> </profiles>

Ahora puedes usar

mvn jetty:run -P DEMO

o simplemente -P DEMO con cualquier comando maven


Spring proporciona dos propiedades separadas al determinar qué perfiles están activos:

  • spring.profiles.active

y

  • spring.profiles.default

Si se establece spring.profiles.active , su valor determina qué perfiles están activos. Pero si spring.profiles.active no está configurado, Spring ve a spring.profiles.default.

Si no se spring.profiles.active ni spring.profiles.active ni spring.profiles.default , no hay perfiles activos, y solo se spring.profiles.default los beans que no están definidos como pertenecientes a un perfil. Cualquier bean que no especifique un perfil pertenece a perfil default


También puede considerar eliminar el perfil PROD y usar @Profile ("! Demo")


Tengo el mismo problema, pero utilizo WebApplicationInitializer para configurar ServletContext mediante programación (Servlet 3.0+). Entonces hago lo siguiente:

public class WebAppInitializer implements WebApplicationInitializer { @Override public void onStartup(ServletContext sc) throws ServletException { // Create the ''root'' Spring application context final AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext(); // Default active profiles can be overridden by the environment variable ''SPRING_PROFILES_ACTIVE'' rootContext.getEnvironment().setDefaultProfiles("prod"); rootContext.register(AppConfig.class); // Manage the lifecycle of the root application context sc.addListener(new ContextLoaderListener(rootContext)); } }