@GetMapping通过application.yml使用数组参数

时间:2018-11-16 11:30:14

标签: java spring spring-boot spring-restcontroller

我已经开发了 @GetMapping RestController,并且一切正常

@GetMapping(path = {"foo", "bar"})
public ResponseEntity<String> foobar() {
    return ResponseEntity.ok("foobar");
}

现在我想使用我的 application.yml 文件外部化路径数组中的值,所以我写了

url:
  - foo
  - bar

我修改了我的代码以使用它,但是它不能以两种不同的方式工作

@GetMapping(path = "${url}")
public ResponseEntity<String> foobar() {
    return ResponseEntity.ok("foobar");
}

@GetMapping(path = {"${url}"})
public ResponseEntity<String> foobar() {
    return ResponseEntity.ok("foobar");
}

我不确定应用程序属性的格式是否正确,或者我是否需要使用SpEL(https://docs.spring.io/spring/docs/3.0.x/reference/expressions.html

我还希望代码根据application.yml属性是动态的,因此,如果 url 值增加或减少,则代码仍必须工作。

我正在使用 Springboot 1.5.13

2 个答案:

答案 0 :(得分:3)

您无法将YAML列表绑定到数组或此处的列表。有关更多信息,请参见:@Value and @ConfigurationProperties behave differently when binding to arrays

但是,您可以通过在yml文件中指定正则表达式来实现此目的,例如:

url: '{var:foo|bar}'

然后您可以直接在控制器中使用它:

@GetMapping(path = "${url}")
public ResponseEntity<String> foobar() {
    return ResponseEntity.ok("foobar");
}

答案 1 :(得分:2)

您可以在控制器中使用

@GetMapping(path = "${url[0]}")
public ResponseEntity<String> foobar() {
    return ResponseEntity.ok("foobar");
}

@GetMapping(path = {"${url[1]}"})
public ResponseEntity<String> foobar() {
    return ResponseEntity.ok("foobar");
}

或者您可以通过以下方式进行操作:

@GetMapping(path = {"${url[0]}","${url[1]}"})
public ResponseEntity<String> foobar() {
    return ResponseEntity.ok("foobar");
}

我认为这很有帮助