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?
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
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.