2016-11-23 9 views
2

Ich versuche SpringBoot zu verwenden, um mit einer Mongo-Datenbank zu sprechen.Warum wird meine Spring Boot (Mongo) Bean nicht erstellt/verwendet?

Es arbeitet mit Spring-Boot-Starter-Data-Mongodb und automatische Konfiguration einer Standard-Bean, die meine MongoRepository-Klassen mit der DB ok sprechen können.

Allerdings möchte ich die Standardwerte überschreiben. Ich könnte application.properties verwenden, aber ich muss in der Lage sein, die Verbindungsparameter als Optionen in der Befehlszeile übergeben, während die Anwendung gestartet wird.

Ich habe versucht, den Port zu ändern, um es zu brechen, habe ich Debugging in die Mongo-Konfiguration hinzugefügt und es scheint, was auch immer ich tun, die Standard-Spring-Konfiguration wird unabhängig verwendet. Es ist, als ob die Annotation @Configuration ignoriert wird.

Ich habe verschiedene Varianten der Konfiguration der Hauptanwendungsklasse ausprobiert (Angabe von conf location, Hinzufügen von @Configuration zur Hauptklasse, mit und ohne @SpringBootApplication ...), aber hier bin ich im 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; 
    } 
} 

Antwort

1

Sie sollten tatsächlich eingebaute Spring Boot MongoDb Starter-Funktionen und zugehörige Autokonfiguration über Anwendungseigenschaften verwenden. Benutzerdefinierte Host, Port, Passwörter usw. können und sollten über eine spezielle Spring Boot MongoDB Properties eingestellt werden:

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. 

und Link auf die vollständige Liste der unterstützten Eigenschaften ist here.

+0

Das ist ein Weg, ja. Aber ist keine Option für diesen. Ich muss diese Eigenschaften auf die Verbindung von Code festlegen. – DaFoot

+1

Dann erstellen Sie eine Bean vom Typ 'org.springframework.boot.autoconfigure.mongo.MongoProperties' selbst - es wird über die Standard ausgewählt. –

+0

Das sieht vielversprechend aus – DaFoot

0

Neben RafalG Vorschlag über MongoProperties kombinierte ich, dass mit der ApplicationArguments Klasse und jetzt irgendwo ich bekomme ....

@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(); 
} 

Natürlich viele Fehler gibt es Handhabung hinzufügen (nulls, nicht usw.) aber hoffentlich wenn jemand anderen helfen kann.

0
@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"; 
} 
Verwandte Themen