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

从YAML(属性)文件读取Spring Boot数组

曹钊
2023-03-14

这是我的项目结构

- src
    - main
        - java
            - mypackage
            - resources
                - config
                    application.yml

我在应用程序中有这个

document:
    templates:
        filetypes:
            - elem1
            - elem2
            - elem3
            - elem4
    hello:
        test: "hello"

在我的endpoint中,我有以下内容

@Value("${document.templates.filetypes}")
List<String> templatesFileTypes;

@Value("${document.hello.test}")
String hello;

在任何函数中,我都可以访问类似于System.out.println(hello)的内容,它工作正常,但对于文件类型,它甚至没有编译,我收到以下错误:

创建名为'配置终结点'的bean时出错:注入自动生成的依赖项失败;嵌套异常是java.lang.IllegalArgumentExc0019:无法解决占位符'document.templates.filetypes'中的值"${document.templates.filetypes}"

搜索了很多,我能找到的每个解决方案都指向write application.yml/application.xml文件,这在我的例子中是无效的,因为我可以读取其他测试字符串,但不能读取数组;

我尝试了String[]我尝试了ArrayList


共有3个答案

马沛
2023-03-14
匿名用户

我认为这也是一个有效的方法:

@Service
public class FileTypeService {
    private final List<String> fileTypes;

    public FileTypeService(Environment environment) {
        this.fileTypes = Binder.get(environment).bind("document.templates.filetypes", Bindable.listOf(String.class)).get();
    }
}

如果需要Set而不是List,则可以使用Bindable.setOf。

岑畅
2023-03-14

@Jose Martinez提供的另一个解决方案可以工作,但实际上没有必要那么清晰,因为它将document.templates.filetypes作为字符串读取,然后将其拆分为字符串数组;因此,我在这里添加了我的解决方案,

1-创建新的类FileTypeProperties

@Configuration
@ConfigurationProperties(prefix = "document.templates")
public class FileTypesConfig {

    private List<String> fileTypes;

    public List<String> getFileTypes() {
        return fileTypes;
    }

    public void setFileTypes(List<String> fileTypes) {
        this.fileTypes = fileTypes;
    }
}

2-创建服务并注入上一个类

@Service
public class FileTypeService {
    private final List<String> fileTypes;

    @Autowired
    public FileTypeService(FileTypesConfig fileTypesConfig){
        this.fileTypes = fileTypesConfig.getFileTypes();
    }

    public List<String> getFileTypes(){
        return this.fileTypes;
    }

}

3-在您的终点,只需自动连线并调用以前的服务即可

@RestController
public class ConfigurationEndPoint {

    @Autowired
    FileTypeService fileTypeService;
    @GetMapping("/api/filetypes")
    @ResponseBody
    public ResponseEntity<List<String>> getDocumentTemplatesFileTypes(){
        return ResponseEntity.ok(fileTypeService.getFileTypes());
    }
}

然后您的yaml文件可以是一个真正的数组

document:
    templates:
        file-types:
            - elem1
            - elem2
            - elem3
            - elem4

我相信这比将字符串拆分成更小的字符串并放入数组更干净,希望这能帮助其他人。

元修然
2023-03-14

一种方法是将元素作为分隔列表传递。通常情况下,我们使用逗号,对于字符串数组它是开箱即用的。要使用列表,则需要使用Spring SPEL格式设置分隔符。。。见下面的例子。

document:
    templates:
        filetypes:elem1,elem2,elem3

-

@Value("${document.templates.filetypes:}")
private String[] array;


@Value("#{'${document.templates.filetypes}'.split(',')}")
private List<String> list;

@PostConstruct
void testList(){
    list.stream().forEach(System.out::println);
    for (String a : array) {
        System.out.println(a);
    }
}
 类似资料:
  • 我有以下问题。我根据一个给定的概要文件在yaml文件中读取的值创建一个数据源。 我当前的问题是,当我用“dev”配置文件启动应用程序时,serviceId的值是'my-prod-service'。 我在这里做错了什么?

  • 问题内容: 在angularJS中,如何从属性文件中读取值? app.js: 问题答案: 如果是驻留在Web服务器上的文件,则只需执行以下操作: 您可以在此处查看示例: http://plnkr.co/edit/3Ne3roFOwcfVmg2mgnUr?p=preview

  • 问题内容: 我创建了一个REST Web服务,在其中创建了config.properties文件来存储和检索整个应用程序中的一些用户名和密码。我将其存储在/src/main/resources/config.properties中。 当我尝试从eclipse的Java代码加载它时,它工作正常。但是当我将它部署在tomcat中时,它没有加载。我用来加载属性文件的代码是 谁能帮我解决这个问题 问题答案

  • 问题内容: 我正在用弹簧。我需要从属性文件中读取值。这是内部属性文件,而不是外部属性文件。属性文件可以如下。 我需要以传统方式从属性文件中读取这些值。如何实现呢?Spring 3.0是否有最新方法? 问题答案: 在你的上下文中配置PropertyPlaceholder: 然后,你引用bean中的属性: 编辑:更新了代码以使用逗号分隔的多个值来解析属性: 如果那不起作用,则可以定义一个带有属性的be

  • 这是我的pom。xml具有如下scm配置 我有一个属性文件,我正在使用properties maven plugin读取该文件,它的值为${my.scm.url},我还使用buildnumber maven plug从SVN获取最新版本。 问题是buildnumber-maven-plugin抛出了无效的scm url错误,但是,当我用实际url替换${my.scm.url}到我的svn repo

  • 你好,我在我的项目中使用Spring Boot和Hikari进行db连接。spinger引导版本是2.2.5.RELEASE,Hikari是3.4.2。但是,当我运行我的项目时,它总是使用Hikari默认配置值,而不是使用我的属性文件中的值。这是我的属性: 这是我在应用程序配置中的数据源: 下面是输出:10:23:19.050[main]DEBUG com . zax xer . hikari .