我正在将Spring Boot从1.3升级到1.5。为了升级到1.5,我已经取代了
@SpringApplicationConfiguration(classes = TestConfig.class)
@WebIntegrationTest
与
@SpringBootTest(classes = TestConfig.class)
另外,我正在使用
@Value("${local.server.port}")
protected int port;
获取application.properties
文件中定义的端口号。我进一步使用此端口号来构建REST URL。
但是在升级之后我得到了下面的错误,而同样适用于1.3
Spring Boot Test。
引起:java.lang.IllegalArgumentException:无法解析值“$ {local.server.port}”中的占位符“local.server.port” 在org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:174)
我错过了为此工作需要做的任何更改。
答案 0 :(得分:4)
您必须为webEnvironment
提供值。在您的情况下 DEFINED_PORT 就像这样
@SpringBootTest(classes = App.class, webEnvironment = WebEnvironment.DEFINED_PORT)
public class YourTest {
@LocalServerPort // shorthand for @Value("${local.server.port}")
private Integer port;
...
}
答案 1 :(得分:1)
对我来说,问题是在我的其他测试中有替代@Configuration
类:
@Configuration
public class ReadPropertiesConfiguration {
@Bean
PropertyPlaceholderConfigurer propConfig() {
PropertyPlaceholderConfigurer placeholderConfigurer = new PropertyPlaceholderConfigurer();
placeholderConfigurer.setLocation(new ClassPathResource("application.properties"));
return placeholderConfigurer;
}
}
该应用程序的和@SpringBootApplication
由于其@ComponentScan而正在挑选它,并且由于某种原因导致了这个问题。当为这些添加排除和/或用其他解决方案替换它们时,事情再次开始工作而没有问题。
我不知道发生这种情况的根本原因,但这也可能是您的问题。
答案 2 :(得分:0)
首先确保属性文件中的属性拼写正确。正如我几天前使用spring-boot-1.5.2&它有效。
或者
您需要添加
@PropertySource( “类路径:application.properties”)
到你的班级,所以它会选择你的配置。
如果您需要不同的测试配置,可以添加
@TestPropertySource(位置= “类路径:test.properties”)
答案 3 :(得分:0)
添加我在其他地方拥有的另一种替代解决方案。
我已经配置
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
和
@RunWith(SpringRunner.class)
@SpringBootTest(classes = App.class, webEnvironment = WebEnvironment.RANDOM_PORT)
public class YourTest {
@LocalServerPort // shorthand for @Value("${local.server.port}")
private Integer port;
...
}
仅此而已,即使在指定网络环境等时仍然出现此错误。我的${local.server.port}
似乎总是空的。
一段时间后,我注意到我的Spring Boot启动消息不包含它正在使用的端口的概念,因此显然它实际上根本没有监听任何端口-这首先解释了为什么它为空。添加实际的容器实现依赖项:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
使它出现在我的日志中:
2019-02-26 18:45:47.231 INFO 12504 --- [ main] o.s.b.web.embedded.jetty.JettyWebServer : Jetty started on port(s) 43132 (http/1.1) with context path '/'
之后,local.server.port和@LocalServerPort也将起作用。
答案 4 :(得分:0)
此问题的另一个常见原因。
我的课程路径中有这种测试课程
import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
@Configuration
public class ReadTestPropertiesConfiguration {
@Bean
PropertyPlaceholderConfigurer propConfig() {
PropertyPlaceholderConfigurer placeholderConfigurer = new PropertyPlaceholderConfigurer();
placeholderConfigurer.setLocations(
new ClassPathResource("application.properties"),
new ClassPathResource("application-test.properties"));
return placeholderConfigurer;
}
}
它没有明确地使用,但是还是被SpringRunner拾取了,只用属性文件中的值覆盖了所有“普通”属性。从类路径中删除此类可以解决此问题。