.yamlや.propertiesではなく.jsonファイルからspring-boot構成をロードすることは可能ですか?ドキュメントを見ると、これはそのままではサポートされていません-それが可能かどうか疑問に思っています。可能であれば、どうすればよいでしょうか。
春のブート方法:
@EnableAutoConfiguration
@Configuration
@PropertySource(value = { "classpath:/properties/config.default.json" }, factory=SpringBootTest.JsonLoader.class )
public class SpringBootTest extends SpringBootServletInitializer {
@Bean
public Object test(Environment e) {
System.out.println(e.getProperty("test"));
return new Object();
}
public static void main(String[] args) {
SpringApplication.run(SpringBootTest.class);
}
public static class JsonLoader implements PropertySourceFactory {
@Override
public org.springframework.core.env.PropertySource<?> createPropertySource(String name,
EncodedResource resource) throws IOException {
Map readValue = new ObjectMapper().readValue(resource.getInputStream(), Map.class);
return new MapPropertySource("json-source", readValue);
}
}
}
独自のPropertySourceFactory
を定義し、@PropertySource
アノテーションを介してフックします。リソースを読み、プロパティを設定し、どこでも使用できます。
唯一のことは、ネストされたプロパティをどのように変換するかです。これを行うSpringの方法(Jsonをプロパティの変数として定義することもできます。以下を参照してください: https://docs.spring.io/spring-boot/docs/current/reference/html/boot -features-external-config.html )は、ネストされたプロパティを次のように変換します。
{"test": { "test2" : "x" } }
になる:
test.test2.x
お役に立てば幸いです。
Artur
YAMLはJSONのスーパーセットです
したがって、SpringBootプロジェクトで次のクラスを作成するだけです。
public class JsonPropertySourceLoader extends YamlPropertySourceLoader {
@Override
public String[] getFileExtensions() {
return new String[]{"json"};
}
}
次に、ファイルを作成します。
/src/main/resources/META-INF/spring.factories
次の内容:
org.springframework.boot.env.PropertySourceLoader=\
io.myapp.JsonPropertySourceLoader
そして、Springアプリケーションはapplication.json
からJSON構成をロードする準備ができています。優先順位は次のようになります:.properties-> .yaml-> .json
複数のアプリがある場合は、共有のPropertySourceLoader
ファイルとspring.factories
ファイルを使用してjarを作成し、必要なプロジェクトに含めることができます。
SPRING_APPLICATION_JSONプロパティは、コマンドラインで環境変数を使用して指定できます。たとえば、UN * Xシェルで次の行を使用できます。
$ SPRING_APPLICATION_JSON = '{"acme":{"name": "test"}}' Java -jar myapp.jar
前の例では、Spring環境でacme.name = testになります。次の例に示すように、SystemプロパティでJSONをspring.application.jsonとして指定することもできます。
$ Java -Dspring.application.json = '{"name": "test"}' -jar myapp.jar
次の例に示すように、コマンドライン引数を使用してJSONを指定することもできます。
$ Java -jar myapp.jar --spring.application.json = '{"name": "test"}'
次のように、JSONをJNDI変数として指定することもできます。
Java:comp/env /spring.application.json。
参照ドキュメント: https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html
2ステップ
public String asYaml(String jsonString) throws JsonProcessingException, IOException {
// parse JSON
JsonNode jsonNodeTree = new ObjectMapper().readTree(jsonString);
// save it as YAML
String jsonAsYaml = new YAMLMapper().writeValueAsString(jsonNodeTree);
return jsonAsYaml;
}
投稿 から取得
そして
public class YamlFileApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
try {
Resource resource = applicationContext.getResource("classpath:file.yml");
YamlPropertySourceLoader sourceLoader = new YamlPropertySourceLoader();
PropertySource<?> yamlTestProperties = yamlTestProperties = sourceLoader.load("yamlTestProperties", resource, null);
applicationContext.getEnvironment().getPropertySources().addFirst(yamlTestProperties);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
投稿 から取得
したがって、両方を組み合わせることができます。 jsonをリソースとしてロードし、yamlに変換してから、見つかったすべてのプロパティを環境に追加します