現在* .propertiesファイルを使用しているSpringアプリケーションがありますが、代わりにYAMLファイルを使用します。
クラス YamlPropertiesFactoryBean が見つかりました。これは必要なことを実行できるようです。
私の問題は、Springアプリケーション(注釈ベースの構成を使用している)でこのクラスを使用する方法がわからないことです。 PropertySourcesPlaceholderConfigurer で setBeanFactory メソッドを使用して設定する必要があるようです。
以前は、次のように @ PropertySource を使用してプロパティファイルをロードしていました。
@Configuration
@PropertySource("classpath:/default.properties")
public class PropertiesConfig {
@Bean
public static PropertySourcesPlaceholderConfigurer placeholderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
}
YAMLファイルを直接ロードできるように、PropertySourcesPlaceholderConfigurerでYamlPropertiesFactoryBeanを有効にするにはどうすればよいですか?または、これを行う別の方法がありますか?
ありがとう。
私のアプリケーションはアノテーションベースの設定を使用しており、Spring Framework 4.1.4を使用しています。いくつかの情報を見つけましたが、 this one のように、Spring Bootを常に指し示していました。
XML構成では、この構成を使用しています。
<context:annotation-config/>
<bean id="yamlProperties" class="org.springframework.beans.factory.config.YamlPropertiesFactoryBean">
<property name="resources" value="classpath:test.yml"/>
</bean>
<context:property-placeholder properties-ref="yamlProperties"/>
もちろん、ランタイムクラスパスへのsnakeyaml依存関係が必要です。
Java configよりもXML configの方が好きですが、変換するのは難しくないはずです。
編集:
完全性のためのJava設定
@Bean
public static PropertySourcesPlaceholderConfigurer properties() {
PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer = new PropertySourcesPlaceholderConfigurer();
YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean();
yaml.setResources(new ClassPathResource("default.yml"));
propertySourcesPlaceholderConfigurer.setProperties(yaml.getObject());
return propertySourcesPlaceholderConfigurer;
}
Springで.ymlファイルを読み取るには、次のアプローチを使用できます。
たとえば、次の.ymlファイルがあります。
section1:
key1: "value1"
key2: "value2"
section2:
key1: "value1"
key2: "value2"
次に、2 Java POJOを定義します。
@Configuration
@EnableConfigurationProperties
@ConfigurationProperties(prefix = "section1")
public class MyCustomSection1 {
private String key1;
private String key2;
// define setters and getters.
}
@Configuration
@EnableConfigurationProperties
@ConfigurationProperties(prefix = "section2")
public class MyCustomSection1 {
private String key1;
private String key2;
// define setters and getters.
}
これで、これらのBeanをコンポーネントに自動接続できます。例えば:
@Component
public class MyPropertiesAggregator {
@Autowired
private MyCustomSection1 section;
}
Spring Bootを使用している場合、すべてが自動スキャンおよびインスタンス化されます。
@SpringBootApplication
public class MainBootApplication {
public static void main(String[] args) {
new SpringApplicationBuilder()
.sources(MainBootApplication.class)
.bannerMode(OFF)
.run(args);
}
}
JUnitを使用している場合、YAMLファイルをロードするための基本的なテストセットアップがあります。
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(MainBootApplication.class)
public class MyJUnitTests {
...
}
TestNGを使用している場合、テスト構成のサンプルがあります。
@SpringApplicationConfiguration(MainBootApplication.class)
public abstract class BaseITTest extends AbstractTestNGSpringContextTests {
....
}
`
package com.yaml.yamlsample;
import com.yaml.yamlsample.config.factory.YamlPropertySourceFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.PropertySource;
@SpringBootApplication
@PropertySource(value = "classpath:My-Yaml-Example-File.yml", factory = YamlPropertySourceFactory.class)
public class YamlSampleApplication implements CommandLineRunner {
public static void main(String[] args) {
SpringApplication.run(YamlSampleApplication.class, args);
}
@Value("${person.firstName}")
private String firstName;
@Override
public void run(String... args) throws Exception {
System.out.println("first Name :" + firstName);
}
}
package com.yaml.yamlsample.config.factory;
import org.springframework.boot.env.YamlPropertySourceLoader;
import org.springframework.core.env.PropertySource;
import org.springframework.core.io.support.DefaultPropertySourceFactory;
import org.springframework.core.io.support.EncodedResource;
import Java.io.IOException;
import Java.util.List;
public class YamlPropertySourceFactory extends DefaultPropertySourceFactory {
@Override
public PropertySource createPropertySource(String name, EncodedResource resource) throws IOException {
if (resource == null) {
return super.createPropertySource(name, resource);
}
List<PropertySource<?>> propertySourceList = new YamlPropertySourceLoader().load(resource.getResource().getFilename(), resource.getResource());
if (!propertySourceList.isEmpty()) {
return propertySourceList.iterator().next();
}
return super.createPropertySource(name, resource);
}
}
My-Yaml-Example-File.yml
person:
firstName: Mahmoud
middleName:Ahmed
Github spring-boot-yaml-sample の私の例を参照
Yml/yamlファイル(application.ymlではない)の外部設定がなぜ異なるのかを理解するのに5〜6時間かかります。さまざまな記事を読んで、オーバーフローの質問をスタックしましたが、正しい答えが得られませんでした。
YamlPropertySourceLoaderを使用してカスタムymlファイル値を使用できたが、のようなエラーを与えているため@Valueを使用できなかったように、私はその間に立ち往生しました。ネストされた例外はJava.lang.IllegalArgumentException:値 "$ {fullname.firstname}"のプレースホルダー 'fullname.firstname'を解決できませんでした
fullnameはymlのプロパティです。
次に、上記のソリューションで指定された「turtlesallthewaydown」を使用し、ついにyamlファイルに問題なく@Valueを使用でき、YamlPropertySourceLoaderを削除しました。
これで、YamlPropertySourceLoaderとPropertySourcesPlaceholderConfigurerの違いを理解できました。大きな感謝ですが、これらの変更をgitリポジトリに追加しました。
Gitリポジトリ: https://github.com/Atishay007/spring-boot-with-restful-web-services
クラス名:SpringMicroservicesApplication.Java