Java 为什么不是';我的SpringBoot(mongo)bean没有被创建/使用吗?

Java 为什么不是';我的SpringBoot(mongo)bean没有被创建/使用吗?,java,spring,spring-boot,Java,Spring,Spring Boot,我正在尝试使用SpringBoot与Mongo数据库通信 它使用SpringBootStarter数据mongodb并自动配置一个默认bean,该bean允许我的MongoRepository类与DB对话ok 但是,我希望覆盖默认值。我可以使用application.properties,但我需要能够在应用程序启动时将连接参数作为选项在命令行上传递 我尝试过改变端口来破坏它,我在Mongo配置中添加了debug,看起来无论我做什么,都会使用默认的spring配置。就好像@Configuratio

我正在尝试使用SpringBoot与Mongo数据库通信

它使用SpringBootStarter数据mongodb并自动配置一个默认bean,该bean允许我的MongoRepository类与DB对话ok

但是,我希望覆盖默认值。我可以使用application.properties,但我需要能够在应用程序启动时将连接参数作为选项在命令行上传递

我尝试过改变端口来破坏它,我在Mongo配置中添加了debug,看起来无论我做什么,都会使用默认的spring配置。就好像@Configuration注释被忽略了一样

我已经尝试过配置主应用程序类的各种风格(指定conf位置,将@Configuration添加到主类中,有@springbootplication…)和没有@springbootplication…),但我现在就在这里

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

实际上,您应该通过应用程序属性使用内置的Spring Boot MongoDb Starter功能和相关的自动配置。自定义主机、端口、密码等可以而且应该通过专用:


支持的属性的完整列表的链接是。

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

当然,要添加很多错误处理(null、非int等),但希望if可以帮助其他人。

这是一种方法,是的。但这不是一个选择。我需要将这些属性设置为来自代码的连接。然后自己创建一个类型为
org.springframework.boot.autoconfigure.mongo.MongoProperties
的bean-它将被选中,而不是默认的。这看起来很有希望
@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";
}
@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";
}