我面临着奇怪的问题与Spring属性Map器.我有yml包含值列表.我想转换为对象列表,为什么构建应用程序.所以,我用@ConfigurationProperties.有了这个,我能够Map简单的类型.当我使用这个复杂的类型(对象列表)它失败了。没有异常,但值列表是零,当我调试。请在下面找到yml和java文件。我尝试与spring 2.0.0,2.0.1,2.0.2,2.0.3没有成功。谁能想出解决办法?
application.yml
acme:
list:
- name: my name
description: my description
- name: another name
description: another description
AcmeProperties.java
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
@Component
@ConfigurationProperties("acme")
@PropertySource("classpath:configuration/yml/application.yml")
public class AcmeProperties {
private final List<MyPojo> list = new ArrayList<>();
public List<MyPojo> getList() {
return this.list;
}
static class MyPojo {
private String name;
private String description;
public String getName() {
return name;
}
public String getDescription() {
return description;
}
}
}
使用setter和getter方法:
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
@ConfigurationProperties(prefix = "acme")
@PropertySource("classpath:configuration/yml/application.yml")
public class AcmeProperties {
private List<MyPojo> list;
public List<MyPojo> getList() {
return list;
}
public void setList(List<MyPojo> list) {
this.list = list;
}
public static class MyPojo {
private String name;
private String description;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
}
这个类的用法:
@Autowired
public HomeController(AppProperties appProperties, AcmeProperties acmeProperties) {
this.appProperties = appProperties;
this.acmeProperties = acmeProperties;
}
4条答案
按热度按时间ttisahbt1#
问题是
PropertySource
只支持属性文件,你不能从yml
文件中读取值。你可以像这样更新它:configuration/yml/test.properties
密码应该能用。
8iwquhpp2#
根据Spring Boot documentation(重点是我的):
24.6.4 YAML缺点
YAML文件不能通过@PropertySource annotation加载,所以如果需要通过这种方式加载值,则需要使用属性文件。
但是您向
@PropertySource
提供了一个yml文件:所以你有两种可能:
@PropertySource
b1zrtrql3#
尝试使用
@ConfigurationProperties(prefix = "acme")
基于:https://aykutakin.wordpress.com/2016/02/26/injecting-list-with-spring-from-yaml/
mrphzbgm4#
我认为问题是在@PropertySource(“classpath:configuration/yml/application.yml”)中没有找到指定的资源。-在尝试调试代码时犯了同样的错误.. -能否请您在org.springframework.context.annotation.ConfigurationClassParser#processPropertySource中放置一个断点,并从this.resourceLoader.getResource(resolvedLocation).getFile()返回监视检查路径。
在我的例子中,我有:C:\Users\user12\Desktop\hibernate\out\production\classes\configuration\application.yml
这里没有application. yml...
我认为您看不到异常,因为Spring在此方法中有if(ignoreResourceNotFound){..} else {throw ex}