Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

275
Views
¿Puedo negar (!) una colección de perfiles de primavera?

¿Es posible configurar un bean de tal manera que no sea utilizado por un grupo de perfiles? Actualmente puedo hacer esto (creo):

 @Profile("!dev, !qa, !local")

¿Hay una notación más ordenada para lograr esto? Supongamos que tengo muchos perfiles. Además, si tengo una implementación simulada y concreta de algún servicio (o lo que sea), ¿puedo simplemente anotar uno de ellos y asumir que el otro se usará en todos los demás casos? En otras palabras, es esto, por ejemplo, necesario:

 @Profile("dev, prof1, prof2") public class MockImp implements MyInterface {...} @Profile("!dev, !prof1, !prof2") //assume for argument sake that there are many other profiles public class RealImp implements MyInterface {...}

¿Podría simplemente anotar uno de ellos y pegar una anotación @Primary en el otro?

En esencia quiero esto:

 @Profile("!(dev, prof1, prof2)")

¡Gracias por adelantado!

over 4 years ago · Santiago Trujillo
3 answers
Answer question

0

Desde Spring 5.1 (incorporado en Spring Boot 2.1) es posible usar una expresión de perfil dentro de la anotación de cadena de perfil (ver la descripción en Profile.of(..) para más detalles).

Entonces, para excluir su bean de ciertos perfiles, puede usar una expresión como esta:

 @Profile("!dev & !prof1 & !prof2")

También se pueden utilizar otros operadores lógicos, por ejemplo:

 @Profile("test | local")
over 4 years ago · Santiago Trujillo Report

0

La respuesta corta es: no puede hacerlo en versiones de Spring anteriores a Spring 5.1 (es decir, versiones de Spring Boot anteriores a 2.1).

Pero existe una buena solución gracias a la anotación @Conditional .

Crear emparejadores de condiciones:

 public static abstract class ProfileCondition extends SpringBootCondition { @Override public ConditionOutcome getMatchOutcome(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) { if (matchProfiles(conditionContext.getEnvironment())) { return ConditionOutcome.match("A local profile has been found."); } return ConditionOutcome.noMatch("No local profiles found."); } protected static abstract boolean matchProfiles(final Environment environment); } public class DevProfileCondition extends ProfileCondition { protected boolean matchProfiles(final Environment environment) { return Arrays.stream(environment.getActiveProfiles()).anyMatch(prof -> { return prof.equals("dev") || prof.equals("prof1") || prof.equals("prof2"); }); } } public static class ProdProfileCondition extends ProfileCondition { protected boolean matchProfiles(final Environment environment) { return Arrays.stream(environment.getActiveProfiles()).anyMatch(prof -> { return (!prof.equals("dev") && !prof.equals("prof1") && !prof.equals("prof2")); }); } }

úsalo

 @Conditional(value = {DevProfileCondition.class}) public class MockImpl implements MyInterface {...} @Conditional(value = {ProdProfileCondition.class}) public class RealImp implements MyInterface {...}

Sin embargo, este enfoque requiere Springboot.

over 4 years ago · Santiago Trujillo Report

0

Por lo que entiendo, lo que quiere hacer es ser capaz de reemplazar algunos de sus beans con algunos stub/mock beans para perfiles específicos. Hay 2 formas de abordar esto:

  • Excluya los beans no necesarios para los perfiles correspondientes e incluya por defecto todo lo demás
  • Incluya solo los beans necesarios para cada perfil

La primera opción es factible pero difícil. Esto se debe a que el comportamiento predeterminado de Spring cuando proporciona múltiples perfiles en la anotación @Profile es una condición OR (no un AND como lo necesitaría en su caso). Este comportamiento de Spring es el más intuitivo, porque idealmente cada perfil debería corresponder a cada configuración de su aplicación (producción, pruebas unitarias, pruebas de integración, etc.), por lo que solo un perfil debería estar activo en cada momento. Esta es la razón por la que OR tiene más sentido que AND entre perfiles. Como resultado de esto, puede evitar esta limitación, probablemente anidando perfiles, pero haría que su configuración fuera muy compleja y menos mantenible.

Por lo tanto, le sugiero que opte por el segundo enfoque. Disponga de un único perfil para cada configuración de su aplicación. Todos los beans que son iguales para cada configuración pueden residir en una clase que no tendrá @Profile especificado. Como resultado, estos beans serán instanciados por todos los perfiles. Para los beans restantes que deben ser distintos para cada configuración diferente, debe crear una clase @Configuration separada (para cada perfil de Spring), teniendo todos ellos con el @Profile establecido en el perfil correspondiente. De esta manera, será muy fácil rastrear lo que se inyecta en cada caso.

Esto debería ser como a continuación:

 @Profile("dev") public class MockImp implements MyInterface {...} @Profile("prof1") public class MockImp implements MyInterface {...} @Profile("prof2") public class MockImp implements MyInterface {...} @Profile("the-last-profile") //you should define an additional profile, not rely on excluding as described before public class RealImp implements MyInterface {...}

Por último, la anotación @Primary se usa para anular beans existentes. Cuando hay 2 beans con el mismo tipo, si no hay una anotación @Primary , obtendrá un error de creación de instancias de Spring. Si define una anotación @Primary para uno de los beans, no habrá ningún error y este bean se inyectará en todos los lugares donde se requiera este tipo (el otro se ignorará). Como ves, esto solo es útil si tienes un único perfil. De lo contrario, esto también se complicará como primera opción.

TL; DR : Sí, puedes. Para cada tipo, defina un bean para cada perfil y agregue una anotación @Profile con solo este perfil.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!