我遇到了Spring属性映射器的奇怪问题。我有yml包含值列表。我想将其转换为对象列表,以构建应用程序。因此,我使用了@ConfigurationProperties。有了这个我就可以映射简单的类型。当我使用它来复杂类型(对象列表)时,它失败了。也不例外,但是当我调试时值列表为零。请在下面找到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;
}
答案 0 :(得分:3)
问题是PropertySource
仅支持属性文件,您无法从yml
文件中读取值。您可以像这样更新它:
@Component
@ConfigurationProperties("acme")
@PropertySource("classpath:/configuration/yml/test.properties")
class AcmeProperties {
configuration / yml / test.properties
acme.list[0].name=my name
acme.list[0].description=my description
acme.list[1].name=another name
acme.list[1].description=another description
并且代码应该有效。
答案 1 :(得分:1)
根据Spring Boot documentation(强调是我的):
24.6.4 YAML缺点
不能通过使用@PropertySource批注来加载YAML文件。 因此,如果您需要以这种方式加载值,则需要使用 属性文件。
但是您向@PropertySource
提供了yml文件:
@Component
@ConfigurationProperties(prefix = "acme")
@PropertySource("classpath:configuration/yml/application.yml")
public class AcmeProperties { ...}
所以您有两种可能性:
@PropertySource
答案 2 :(得分:0)
尝试
@ConfigurationProperties(prefix = "acme")
基于: https://aykutakin.wordpress.com/2016/02/26/injecting-list-with-spring-from-yaml/
答案 3 :(得分:0)
我认为问题是找不到在@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 ...
我认为您没有看到异常,因为春天有 if(ignoreResourceNotFound){..} else {throw ex}这种方法