我使用spring boot 1.5.9编写一个小型休息服务器。我刚开始使用初始化代码并且遇到了这种奇怪的行为。
我有一个小测试 -
@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个错误字段'port'上的对象'mongo'中的字段错误:被拒绝的值 [$ {mongo.port:27017}];代码 [typeMismatch.mongo.port,typeMismatch.port,typeMismatch.int,typeMismatch]; 参数 [org.springframework.context.support.DefaultMessageSourceResolvable: 代码[mongo.port,port];参数[];默认消息[port]]; 默认消息[无法转换类型的属性值 'java.lang.String'到属性'port'的必需类型'int';嵌套 例外是 org.springframework.core.convert.ConverterNotFoundException:没有 转换器发现能够从类型[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) 〜[spring-boot-1.5.9.RELEASE.jar:1.5.9.RELEASE] ... 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;
}
}
我确实使用@EnableAutoConfiguration注释而不是@SpringBootTest运行测试。但这只适用于其中一项测试。我认为你的测试在哪个包中很重要,我认为@EnableAutoConfiguration可能不是正确的方法。
我一直在调试弹簧源一段时间,没有任何线索。
如果您有任何建议,请与我们联系。
编辑1: 根据要求,添加application.properties
mongo.host=localhost
mongo.port=${mongo.port:27017}
mongo.db=${mongo.db:synctool}
答案 0 :(得分:-1)
不确定您的语法
mongo.port = $ {mongo.port:27017}
spring尝试将 $ {mongo.port:27017} 转换为MongoProperties.port整数属性
无法转换类型' java.lang.String'的属性值要求的类型' int'对于物业'港口'
如果要为您的属性设置一些默认值 见Spring-boot: set default value to configurable properties