当前位置: 首页 > 知识库问答 >
问题:

从json文件加载spring启动属性

申屠秦斩
2023-03-14

是否可以从服务器加载Spring Boot配置。json文件,而不是。亚马尔。房产?从文档来看,这是不支持开箱即用的——我想知道这是否可能,如果可能的话,人们将如何着手呢?

共有3个答案

锺离嘉茂
2023-03-14

SPRING_应用程序_JSON属性可以在命令行上与环境变量一起提供。例如,可以在UN*X shell中使用以下行:

$SPRING_APPLICATION_JSON='{“acme”:{“name”:“test”}'java-jar myapp。罐子

在前面的例子中,您最终得到了acme。name=在Spring环境中进行测试。您还可以将JSON作为spring提供。应用系统属性中的json,如下例所示:

$java-Dspring.application.html" target="_blank">json='{"name":"test"}'-jarmyapp.jar

还可以使用命令行参数提供JSON,如下例所示:

$java-jarmyapp。罐子——Spring。应用json='{“name”:“test”}

您还可以将JSON作为JNDI变量提供,如下所示:

java:comp/env/spring。应用json。

参考留档:https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html

颜畅
2023-03-14

Spring启动方式:

@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

希望有帮助,

阿图尔

高兴贤
2023-03-14

如文档和GitHub上所述

YAML是JSON的超集

因此,您可以在Spring Boot项目中创建以下类:

public class JsonPropertySourceLoader extends YamlPropertySourceLoader {
    @Override
    public String[] getFileExtensions() {
        return new String[]{"json"};
    }
}

然后创建一个文件:

/src/main/resources/META-INF/spring。工厂包含以下内容:

org.springframework.boot.env.PropertySourceLoader=\
io.myapp.JsonPropertySourceLoader

您的Spring应用程序已经准备好从application.json加载JSON配置。优先级将是:。属性-

如果你有多个应用,你可以用共享的PropertySourceLoaderspring创建一个jar。工厂文件,以便将其包含到您需要的任何项目中。

 类似资料:
  • 我在尝试添加

  • 问题内容: 我已经编写了一个PropertyUtils类(来自互联网),它将加载属性 而PropertiesUtil类如下所示 稍后,我可以通过调用PropertiesUtil.getProperty()方法来获取属性。 但是现在我要稍作修改,以便如果myApp.properties被用户修改/更改,则应再次加载 可能我需要FileWatcher类 但我的怀疑是 如何使用classpath:myA

  • 我已经写了一个PropertyUtils类(来自互联网),它将加载属性 PropertiesUtil类如下所示 稍后,我可以通过调用PropertiesUtil来获取属性。getProperty()方法。 但现在我想稍微修改一下,如果myApp。属性被用户修改/更改,应该重新加载 可能我需要FileWatcher类 但我的疑虑是 如何使用classpath创建File对象:myApp/myApp.

  • 对于spring framework,我想手动重新加载属性文件中的数据。实际上,当我手动运行这个servlet文件时,我必须编写一个重新加载servlet来手动重新加载数据。 我已经为MessageSource定义了Spring配置。 但不希望在特定时间段自动加载,例如,设置时可以自动加载: 我以前尝试过clear缓存(),但没有自动加载。

  • 并将属性加载到映射中,结果为: 有什么想法如何创建一个映射策略吗?

  • 我们正在将csv文件从Angular上传到Spring boot 2。x app包含约100万条记录,这100万条记录在间隔超过20分钟后在服务器上处理。csv文件请求将文件从Angular加载到Spring boot需要更多时间,在Spring boot应用程序中接收文件大约需要20分钟。 在application.yml文件中配置 servlet:多部分:已启用:真实最大文件大小:200MB最