我有一个spring boot应用程序,必须从yaml文件中读取属性。
代码:
@Component
@PropertySource("classpath:application.yml")
public class ResourceProvider {
@Autowire
private Environment env;
public String getValue(String key) {
return env.getProperty("app.max.size");
}
}
yaml文件
app:
max:
size: 10
当我尝试此操作时不起作用。我得到app.max.size
的值为null。对于size
,我得到的值为10。
当我使用application.properties时。我能够得到理想的结果。 我做错了什么吗?
application.properties
app.max.size=10
答案 0 :(得分:1)
来自文档:
无法使用@PropertySource批注来加载YAML文件。因此,在需要以这种方式加载值的情况下,需要使用属性文件。
答案 1 :(得分:1)
由于您正在使用func ApplePushNotificationService(deviceToken string, parameters string) {
cert, err := certificate.FromP12File("./hookupAPNS.p12", "******") //p12.filename
if err != nil {
log.Fatal("Cert Error:", err)
}
notification := &apns2.Notification{}
notification.DeviceToken = deviceToken
notification.Topic = "com.preferme.hookup"
payload := payload.NewPayload().Alert(parameters).AlertBody(parameters).Badge(1).Sound("sound.wav").Custom("key", "val")
notification.Payload = payload
client := apns2.NewClient(cert).Production()
res, err := client.Push(notification)
if err != nil {
log.Fatal("push Error:", err)
}
fmt.Printf("%v %v %v\n", res.StatusCode, res.ApnsID, res.Reason)
}
文件,因此不需要手动将文件加载到上下文,因为它是application.yml
应用程序的默认配置文件。您可以像下面这样在spring
装饰类中使用它们;
@Component
如果您要加载自定义@Value("${app.max.size}")
private int size;
文件,那么在Spring中这是一个巨大的问题。使用YAML
不能简单地加载YAML文件。有可能,但几乎不需要任何工作。首先,您需要一个自定义属性源工厂。您的情况是自定义YAML属性源工厂。
@PropertySource
而且,每次使用时,都需要告诉import org.springframework.beans.factory.config.YamlPropertiesFactoryBean;
import org.springframework.core.env.PropertiesPropertySource;
import org.springframework.core.env.PropertySource;
import org.springframework.core.io.support.EncodedResource;
import org.springframework.core.io.support.PropertySourceFactory;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Objects;
import java.util.Properties;
public class YamlPropertySourceFactory implements PropertySourceFactory {
/**
* Create a {@link PropertySource} that wraps the given resource.
*
* @param name the name of the property source
* @param resource the resource (potentially encoded) to wrap
* @return the new {@link PropertySource} (never {@code null})
* @throws IOException if resource resolution failed
*/
@Override
public PropertySource<?> createPropertySource(String name, EncodedResource resource)
throws IOException {
Properties properties = load(resource);
return new PropertiesPropertySource(name != null ? name :
Objects.requireNonNull(resource.getResource().getFilename(), "Some error message"),
properties);
}
/**
* Load properties from the YAML file.
*
* @param resource Instance of {@link EncodedResource}
* @return instance of properties
*/
private Properties load(EncodedResource resource) throws FileNotFoundException {
try {
YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
factory.setResources(resource.getResource());
factory.afterPropertiesSet();
return factory.getObject();
} catch (IllegalStateException ex) {
/*
* Ignore resource not found.
*/
Throwable cause = ex.getCause();
if (cause instanceof FileNotFoundException) throw (FileNotFoundException) cause;
throw ex;
}
}
}
批注使用此工厂,而不要使用默认工厂;
@PropertySource
您可以使用上面代码片段的@Component
@PropertySource(value = "classpath:config-prop.yml", factory = YamlPropertySourceFactory.class) // Note the file name with the extension unlike a property file. Also, it's not the `application.yml` file.
public class ResourceProvider {
@Value("${app.max.size}")
private int size;
}
变量中显示的属性。
尽管。如果您使用YAML数组声明获取属性,那么即使使用这种方法,也不会有什么特殊之处。
答案 2 :(得分:0)
基于Spring Docs,@ PropertySource不支持yml文件。
要解析yml文件,请参考以下链接:https://www.mkyong.com/spring-boot/spring-boot-yaml-example/
答案 3 :(得分:-1)
您可以通过以下方式读取值:
@Value("${app.max.size}")
private String size;
public String getValue(String key) {
return size;
}