0

我正在使用 spring boot 1.5.9 编写一个小型的 rest 服务器。我刚刚开始使用初始化代码并陷入了这种奇怪的行为。

我有一个小测试-

@RunWith(SpringRunner.class)
@SpringBootTest
public class TestMongo {

    @Autowired
    private MongoOperations mongoOps; 

    @Test
    public void testMongoConnection() {
        assertFalse(mongoOps.collectionExists("test"));
    }
}

最初,application.properties 被忽略了。在我添加 @SpringBootTest 注释后,application.properties 被读取,但开始出现以下错误。

引起:org.springframework.validation.BindException:org.springframework.boot.bind.RelaxedDataBinder$RelaxedBeanPropertyBindingResult:1 错误字段“端口”上的对象“mongo”中的字段错误:拒绝值 [${mongo.port:27017}] ; 代码 [typeMismatch.mongo.port,typeMismatch.port,typeMismatch.int,typeMismatch]; 参数 [org.springframework.context.support.DefaultMessageSourceResolvable: 代码 [mongo.port,port]; 论据 []; 默认消息[端口]];默认消息 [无法将类型“java.lang.String”的属性值转换为属性“port”所需的类型“int”;嵌套异常是 org.springframework.core.convert.ConverterNotFoundException:在 org.springframework.boot.bind 找不到能够从类型 [java.lang.String] 转换为类型 [int]] 的转换器。

我试过这个声明端口为 java.lang.Integer 以及 int。

配置 bean 看起来像这样 -

@Configuration
@EnableConfigurationProperties(MongoProperties.class)
public class SpringConfiguration {

    private MongoProperties mongoPropertiesConfiguration;

    public MongoProperties getMongoConfiguration() {
        return mongoPropertiesConfiguration;
    }


    @Autowired
    public void setMongoConfiguration(MongoProperties mongoConfiguration) {
        this.mongoPropertiesConfiguration = mongoConfiguration;
    }



    public @Bean MongoClient mongoClient() {
        return new MongoClient(mongoPropertiesConfiguration.getHost(), mongoPropertiesConfiguration.getPort());
    }

    public @Bean MongoDbFactory mongoDbFactory() {
        return new SimpleMongoDbFactory(mongoClient(), mongoPropertiesConfiguration.getDb());
    }

    public @Bean MongoOperations mongoOperations() {
        return new MongoTemplate(mongoDbFactory());
    }
}

@ConfigurationProperties(prefix="mongo")
public class MongoProperties {

    private String host;
    private Integer port;
    private String db;

    public String getHost() {
        return host;
    }
    public void setHost(String host) {
        this.host = host;
    }
    public Integer getPort() {
        return port;
    }
    public void setPort(Integer port) {
        this.port = port;
    }
    public String getDb() {
        return db;
    }
    public void setDb(String db) {
        this.db = db;
    }

}

我确实使用@EnableAutoConfiguration 注释而不是@SpringBootTest 运行了测试。但这仅适用于其中一项测试。我认为您的测试在哪个包中很重要,而且我认为 @EnableAutoConfiguration 可能不是正确的方法。

我已经调试spring源有一段时间了,没有任何线索。

如果您有任何建议,请告诉我。

编辑 1:根据要求,添加 application.properties

mongo.host=localhost
mongo.port=${mongo.port:27017}
mongo.db=${mongo.db:synctool}
4

1 回答 1

-1

不确定你的语法

mongo.port=${mongo.port:27017}

春天尝试将${mongo.port:27017}转换为您的 MongoProperties.port Integer 属性

无法将类型“java.lang.String”的属性值转换为属性“port”所需的类型“int”

如果您想为您的属性设置一些默认值,请参阅Spring-boot: set default value to configure properties

于 2017-12-28T21:35:42.053 回答