我在测试资源目录中有一个特殊的属性文件
└── test
├── java
│ └── com
│ └── inter3i
│ ├── dao
│ │ └── FooMapperTest.java
└── resources
└── application.properties
在这个application.properties文件中我指定了MySQL URL。
spring.datasource.url=jdbc:mysql://139.224.xxx.xxx/foo?useSSL=false
然后我执行测试
mvn test -Dtest=com.foo.reportapi.dao.FooMapperTest
但失败了,因为
org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for transaction; nested exception is com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
at org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:289) ~[spring-jdbc-4.3.10.RELEASE.jar:4.3.10.RELEASE]
但实际上MySQL URK没问题,为什么会出现这个错误?来自wireshark我知道它实际连接到另一个URL
spring.datasource.url=jdbc:mysql://192.168.0.25/foo
在application-default.properties
src
├── main
│ └── resources
│ ├── application-default.properties
那为什么这么违反直觉呢?我认为测试类应首先在测试资源中使用application.properties
。
另外我必须使用wireshark来查找它所连接的URL,我怎样才能让Spring Boot明确输出MySQL URL信息?
答案 0 :(得分:1)
正如jonrsharpe已经提到的,特定的配置文件优先于application.properties文件 - 在这里您可以找到PropertySource订单的文档:
您可以通过多种方式修复它:
我建议#3,因为它不依赖于main和test元素的classpath优先级,并清楚地说明了使用的文件。
现在到你问题的记录部分。
如果将弹簧日志级别增加到" debug"你可以看到加载了哪些配置文件。您可以在自己的代码中记录特定属性:
@Component
@Slf4j
public class LogSpringDatasourceUrlProperty {
@Autowired
public LogSpringDatasourceUrlProperty(@Value("${spring.datasource.url}") String jdbcUrl){
log.info( "application uses '{}' as jdbcUrl", jdbcUrl );
}
}