我正在使用 spring boot 1.5.9 编写一个小型休息服务器。我刚刚开始使用初始化代码,并陷入了这种奇怪的行为。
我有一个小测试——
@RunWith(SpringRunner.class)
@SpringBootTest
public class TestMongo {
@Autowired
private MongoOperations mongoOps;
@Test
public void testMongoConnection() {
assertFalse(mongoOps.collectionExists("test"));
}
}
最初,应用程序属性被忽略。添加@SpringBootTest注释后,读取了应用程序属性,但开始发生以下错误。
原因: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.DefaultMessageSourceResolvevable: 代码 [mongo.port,port];参数 [];默认消息 [端口]]; 默认消息 [无法转换类型的属性值 "java.lang.String"到属性"port"所需的类型"int";嵌 套 例外情况是 org.springframework.core.convert.ConverterNotFoundException: No 发现能够从类型 [java.lang.String] 转换为 键入 [int]] 在 org.springframework.boot.bind.PropertiesConfigurationFactory.checkForBindingErrors(PropertiesConfigurationFactory.java:359) ~[spring-boot-1.5.9.RELEASE.jar:1.5.9.RELEASE] at org.springframework.boot.bind.PropertiesConfigurationFactory.doBindPropertiesToTarget(PropertiesConfigurationFactory.java:276) ~[spring-boot-1.5.9.RELEASE.jar:1.5.9.RELEASE] at org.springframework.boot.bind.PropertiesConfigurationFactory.bindPropertiesToTarget(PropertiesConfigurationFactory.java:240) ~[spring-boot-1.5.9.RELEASE.jar:1.5.9.RELEASE] at org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor.postProcessBeforeInitialization(ConfigurationPropertiesBindingPostProcessor.java:330) ~[弹簧引导-1.5.9.发布.jar:1.5.9.发布] ...56 个常见框架 省略
我已经尝试了这个声明端口作为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;
}
}
我确实使用注释而不是@SpringBootTest@EnableAutoConfiguration运行了测试。但这只适用于其中一个测试。我认为您的测试在哪个包中很重要,我认为@EnableAutoConfiguration可能不是正确的方法。
我已经调试弹簧源一段时间了,没有任何引线。
如果您有任何建议,请告诉我。
编辑 1: 根据请求,添加应用程序属性
mongo.host=localhost
mongo.port=${mongo.port:27017}
mongo.db=${mongo.db:synctool}
不确定你的语法
mongo.port=${mongo.port:27017}
春季尝试将${mongo.port:27017}转换为您的 MongoProperties.port 整数属性
无法将类型为"java.lang.String"的属性值转换为属性"端口"所需的类型"int">
如果要为媒体资源设置一些默认值 请参阅 Spring-boot:将默认值设置为可配置属性