2016-11-23 111 views
2

我正在嘗試使用SpringBoot與Mongo數據庫交談。爲什麼我的spring引導(mongo)bean被創建/使用?

它正在使用spring-boot-starter-data-mongodb並自動配置一個默認的bean,它允許我的MongoRepository類與數據庫對話。

但是,我想覆蓋默認值。我可以使用application.properties,但我需要能夠在應用程序啓動時在命令行上將連接參數作爲選項傳遞。

我試着改變端口來打破它,我已經將調試添加到了Mongo配置中,並且似乎無論我做了什麼默認的彈簧配置都在使用。就好像@Configuration註釋被忽略。

我已經嘗試了各種配置主應用程序類(指定conf位置,將@Configuration添加到主類,帶和不帶@SpringBootApplication ...)的風格,但這裏是我現在的位置......

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; 
    } 
} 

回答

1

實際上,您應該使用內置的Spring Boot MongoDb Starter功能和通過應用程序屬性進行相關自動配置。自定義主機,端口,密碼等,可以而且應該通過專用Spring Boot MongoDB Properties設置:

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. 

,並鏈接到支持的屬性的完整列表here

+0

這是一種方法,是的。但是這不是一個選項。 我需要將這些屬性設置爲代碼連接。 – DaFoot

+1

然後自己創建一個org.springframework.boot.autoconfigure.mongo.MongoProperties'類型的bean - 它將被選中默認的一個。 –

+0

看起來很有希望 – DaFoot

0

除了RafalG的約MongoProperties建議,我結合,與ApplicationArguments類,現在我得到的地方....

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

當然還有很多的錯誤處理添加(空,無 - 等),但希望如果可以幫助別人。

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"; 
} 
相關問題