web-dev-qa-db-fra.com

Printemps: sélection de @Service en fonction du profil

J'ai une interface définie comme ci-dessous:

public interface MyService {
}

Et deux classes l'implémentant:

@Service
@Profile("dev")
public class DevImplementation implements MyService {
}

et

@Service
@Profile("prod")
public class ProdImplementation implements MyService {
}

Et il y a un autre service qui essaie de l'utiliser:

@Service
public MyClass {
    @Autowired
    MyService myservice;
}

Le problème est que j'obtiens NoSuchBeanException lors de l'exécution du code. Il est exécuté en utilisant

mvn spring-boot:run -P dev

Qu'est-ce que je fais mal?

15
shyam

Avec -P vous activez un profil Maven. Cependant, les profils Maven sont indépendants des profils Spring. Tant que le profil Maven n'est pas configuré pour définir la propriété Spring appropriée, vous devez activer le profil Spring de cette façon:

mvn spring-boot:run -Dspring.profiles.active=dev
10
dunni

Une autre façon de le faire est d'avoir un profil de production et le développement est implicite s'il n'est pas défini, par exemple.

@Component
@Profile("prod")
public class ProdImplementation implements MyService {
}

... et l'implémentation du développeur a le profil "! prod".

@Component
@Profile("!prod")
public class DevImplementation implements MyService {
}

Donc, pour fonctionner en mode production, vous devez taper le profil ...

> mvn spring-boot:run -Dspring.profiles.active=prod

... et le mode de développement ne nécessite pas de profil ...

> mvn spring-boot:run

OMI un peu plus facile.

6
bobmarksie