2 votes

Pourquoi mon bean spring boot (mongo) n'est-il pas créé / utilisé ?

J'essaie d'utiliser SpringBoot pour parler à une base de données Mongo.

Cela fonctionne en utilisant spring-boot-starter-data-mongodb et en configurant automatiquement un bean par défaut qui permet à mes classes MongoRepository de communiquer avec la base de données.

Cependant, je veux remplacer les valeurs par défaut. Je pourrais utiliser application.properties mais je dois pouvoir passer les paramètres de connexion en tant qu'options sur la ligne de commande au démarrage de l'application.

J'ai essayé de changer le port pour le casser, j'ai ajouté le débogage à la configuration de Mongo et il semble que quoi que je fasse, la configuration par défaut de Spring est utilisée. C'est comme si l'annotation @Configuration était ignorée.

J'ai essayé plusieurs façons de configurer la classe de l'application principale (en spécifiant l'emplacement de la conf, en ajoutant @Configuration à la classe principale, avec et sans @SpringBootApplication ...), mais voici où j'en suis pour le moment.....

package somepackage

@EnableAutoConfiguration
@ComponentScan
public class MyApplication {

public static void main(String[] args) {
    ApplicationContext ctx = SpringApplication.run(MyApplication.class, args);
    ....
}

package somepackage.conf; // should be picked up by ComponentScan, no?
@Configuration
public class MongoConf {

    @Bean
    public MongoClientFactoryBean mongo() throws Exception {
        MongoClientFactoryBean mongo = new MongoClientFactoryBean();

        /*
         setting to silly values to try to prove it is trying to create connections using this bean - expected to see errors because can't create connection... */
        mongo.setHost("flibble");
        mongo.setPort(345);
        return mongo;
    }
}

1voto

R4J Points 62

Vous devriez en fait utiliser les fonctions intégrées de Spring Boot MongoDb Starter et la configuration automatique correspondante via les propriétés de l'application. L'hôte, le port, les mots de passe personnalisés, etc. peuvent et doivent être définis via les propriétés dédiées de l'application. Propriétés de Spring Boot MongoDB :

spring.data.mongodb.authentication-database= # Authentication database name.
spring.data.mongodb.database=test # Database name.
spring.data.mongodb.field-naming-strategy= # Fully qualified name of the FieldNamingStrategy to use.
spring.data.mongodb.grid-fs-database= # GridFS database name.
spring.data.mongodb.host=localhost # Mongo server host.
spring.data.mongodb.password= # Login password of the mongo server.
spring.data.mongodb.port=27017 # Mongo server port.
spring.data.mongodb.repositories.enabled=true # Enable Mongo repositories.
spring.data.mongodb.uri=mongodb://localhost/test # Mongo database URI. When set, host and port are ignored.
spring.data.mongodb.username= # Login user of the mongo server.

Et le lien vers la liste complète des propriétés prises en charge est le suivant aquí .

1voto

DaFoot Points 676

En plus de la suggestion de RafalG concernant MongoProperties, j'ai combiné cela avec la classe ApplicationArguments et maintenant j'obtiens quelque part.....

@Bean
@Primary
public MongoProperties mongoProperties(ApplicationArguments args) {
    MongoProperties props = new MongoProperties();
    String[] mongoHostAndPort = args.getSourceArgs()[3].split(":");
    props.setHost(mongoHostAndPort[0]);
    props.setPort(Integer.parseInt(mongoHostAndPort[1]));
    return props;
}

@Bean
public MongoClientFactoryBean mongo() {
    return new MongoClientFactoryBean();
}

Bien sûr, il y a beaucoup de gestion d'erreurs à ajouter (nulles, non-int, etc.) mais j'espère que cela pourra aider quelqu'un d'autre.

0voto

Zubair Nabi Points 656
@Configuration
@EnableAutoConfiguration(exclude = { EmbeddedMongoAutoConfiguration.class })
@Profile("!testing")
public class TestMongoConfig extends AbstractMongoConfiguration {

private static final MongodStarter starter =     MongodStarter.getDefaultInstance();

private MongodExecutable _mongodExe;
private MongodProcess _mongod;
private MongoClient _mongo;

@Value("${spring.data.mongodb.host}")
private String host;

@Value("${spring.data.mongodb.port}")
private Integer port;

@Override
protected String getDatabaseName() {
    return "test";
}

@Bean
public Mongo mongo() throws Exception {
    _mongodExe = starter.prepare(new MongodConfigBuilder()
                        .version(Version.Main.PRODUCTION)
                        .net(new Net(port, Network.localhostIsIPv6()))
                        .build());
    _mongod = _mongodExe.start(); 
    return  new MongoClient(host, port);
}

@Override
public String getMappingBasePackage() {
    return "com.test.domain";
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X