web-dev-qa-db-ja.com

jsonファイルからSpring-Bootプロパティをロードします

.yamlや.propertiesではなく.jsonファイルからspring-boot構成をロードすることは可能ですか?ドキュメントを見ると、これはそのままではサポートされていません-それが可能かどうか疑問に思っています。可能であれば、どうすればよいでしょうか。

6
Andy W

春のブート方法:

@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

5
pandaadb

前述のように ドキュメント内 および GitHub上

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を作成し、必要なプロジェクトに含めることができます。

4
Kirill

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
Ashu

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に変換してから、見つかったすべてのプロパティを環境に追加します

0
StanislavL