Spring 将YAML配置加载到Groovy映射中

Spring 将YAML配置加载到Groovy映射中,spring,spring-boot,groovy,Spring,Spring Boot,Groovy,我想从Spring Boot中读取此配置YAML: host: api1: http://api1.com api2: http://api2.com api3: http://api3.com 并让它创建一个新对象,使其如下所示: def apiUrls = ["api1":new Api("http://api1.com"), "api2":new Api("http://api2.com"), "ap

我想从Spring Boot中读取此配置YAML:

host:
  api1: http://api1.com
  api2: http://api2.com
  api3: http://api3.com
并让它创建一个新对象,使其如下所示:

def apiUrls = ["api1":new Api("http://api1.com"),
                   "api2":new Api("http://api2.com"),
                   "api3":new Api("http://api3.com")]
public class Props implements GroovyObject {
    private Map<String, String> vals;

    public Props() { /* Groovy magic including field initialization */ }

    public Map<String, String> getVals() { return this.vals; }
}
我已经从堆栈溢出(例如)尝试了几种解决方案,但结果总是空映射。变量已明确加载(它们存在于/management/env中)


有人知道如何在Groovy中实现这一点吗?

在中可能有点模糊,但对于贴图,您必须:

  • 始终提供一个干劲
  • 初始化映射或提供setter
使用Groovy时,这就足够了:

@Component
@ConfigurationProperties(prefix = "props")
class Props {
    Map<String, String> vals
}
@组件
@配置属性(前缀=“props”)
课堂道具{
地图VAL
}
它将大致编译成

public class Props implements GroovyObject {
    private Map<String, String> vals;

    public Map<String, String> getVals() { return this.vals; }
    public void setVals(Map<String, String> vals) { this.vals = vals; }
}
公共类道具实现GroovyObject{
专用地图VAL;
公共映射getVals(){返回this.vals;}
public void setVals(Map vals){this.vals=vals;}
}

如果只有一个getter方法是至关重要的,那么可以按如下方式编写该类:

@Component
@ConfigurationProperties(prefix = "props")
class Props {
    private Map<String, String> vals = [:]
    Map<String, String> getVals() { vals }
}
@组件
@配置属性(前缀=“props”)
课堂道具{
私有映射VAL=[:]
映射getVals(){vals}
}
这将编译成如下内容:

def apiUrls = ["api1":new Api("http://api1.com"),
                   "api2":new Api("http://api2.com"),
                   "api3":new Api("http://api3.com")]
public class Props implements GroovyObject {
    private Map<String, String> vals;

    public Props() { /* Groovy magic including field initialization */ }

    public Map<String, String> getVals() { return this.vals; }
}
公共类道具实现GroovyObject{
专用地图VAL;
public Props(){/*Groovy magic,包括字段初始化*/}
公共映射getVals(){返回this.vals;}
}

在地图中可能有点模糊,但对于地图,您必须:

  • 始终提供一个干劲
  • 初始化映射或提供setter
使用Groovy时,这就足够了:

@Component
@ConfigurationProperties(prefix = "props")
class Props {
    Map<String, String> vals
}
@组件
@配置属性(前缀=“props”)
课堂道具{
地图VAL
}
它将大致编译成

public class Props implements GroovyObject {
    private Map<String, String> vals;

    public Map<String, String> getVals() { return this.vals; }
    public void setVals(Map<String, String> vals) { this.vals = vals; }
}
公共类道具实现GroovyObject{
专用地图VAL;
公共映射getVals(){返回this.vals;}
public void setVals(Map vals){this.vals=vals;}
}

如果只有一个getter方法是至关重要的,那么可以按如下方式编写该类:

@Component
@ConfigurationProperties(prefix = "props")
class Props {
    private Map<String, String> vals = [:]
    Map<String, String> getVals() { vals }
}
@组件
@配置属性(前缀=“props”)
课堂道具{
私有映射VAL=[:]
映射getVals(){vals}
}
这将编译成如下内容:

def apiUrls = ["api1":new Api("http://api1.com"),
                   "api2":new Api("http://api2.com"),
                   "api3":new Api("http://api3.com")]
public class Props implements GroovyObject {
    private Map<String, String> vals;

    public Props() { /* Groovy magic including field initialization */ }

    public Map<String, String> getVals() { return this.vals; }
}
公共类道具实现GroovyObject{
专用地图VAL;
public Props(){/*Groovy magic,包括字段初始化*/}
公共映射getVals(){返回this.vals;}
}

您可以使用snakeyaml。这里的示例:您可以使用snakeyaml。示例如下: