我正在使用 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}