Spring - YML 数组 属性 为空
Spring - YML array property is null
我正在尝试从 application.yml
中读取字符串数组,但没有成功。
Environment
和 @Value
注释,总是 return null.
如果我读取一个项目而不是整个数组,一切正常。
这里是代码:
来源
启动应用程序和 Rest 控制器
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@RestController
class WithEnvCtrl {
@Autowired
private Environment env;
@RequestMapping(value = "/with_env", method = { RequestMethod.GET, RequestMethod.POST }, produces = "application/json")
public String test() {
System.err.println(env.getProperty("this.is.array[0]"));
System.err.println(env.getProperty("this.is.array", List.class));
System.err.println(env.getProperty("this.is.array", String[].class));
return env.getProperty("this.is.array[0]");
}
}
@RestController
class WithValueAnnotation {
@Value("${this.is.array[0]}")
private String first;
@Value("${this.is.array}")
private List<String> list;
@Value("${this.is.array}")
private String[] array;
@RequestMapping(value = "/with_value_annotation", method = { RequestMethod.GET, RequestMethod.POST }, produces = "application/json")
public String test() {
System.err.println(first);
System.err.println(list);
System.err.println(array);
return first;
}
}
application.yml 文件
this:
is:
array:
- "casa"
- "pesenna"
结果
WithEnvCtrl.test
方法打印:
casa
null
null
null
WithValueAnnotation.test
方法正确地将变量 first
设置为数组的第一个元素 (casa
)。但是属性list
和array
上的注解@Value
导致异常:
java.lang.IllegalArgumentException: Could not resolve placeholder 'this.is.array' in string value "${this.is.array}"
这是一个示例项目:property-array。
非常感谢!
解决者:
- 使用注释
@ConfigurationProperties
;
- 正在声明一个与 yml 同名的属性 属性;
- 为属性定义 get 方法;
- 正在初始化属性或定义设置方法。
这里是代码:
import java.util.List;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@RestController
@ConfigurationProperties(prefix="this.is")
class WithValueAnnotation {
private List<String> array;
public List<String> getArray(){
return this.array;
}
public void setArray(List<String> array){
this.array = array;
}
@RequestMapping(value = "/test_cfg", method = { RequestMethod.GET,
RequestMethod.POST }, produces = "application/json")
public String test() {
System.err.println(array);
return array.toString();
}
}
谢谢@Quagaar。
我正在尝试从 application.yml
中读取字符串数组,但没有成功。
Environment
和 @Value
注释,总是 return null.
如果我读取一个项目而不是整个数组,一切正常。
这里是代码:
来源
启动应用程序和 Rest 控制器
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@RestController
class WithEnvCtrl {
@Autowired
private Environment env;
@RequestMapping(value = "/with_env", method = { RequestMethod.GET, RequestMethod.POST }, produces = "application/json")
public String test() {
System.err.println(env.getProperty("this.is.array[0]"));
System.err.println(env.getProperty("this.is.array", List.class));
System.err.println(env.getProperty("this.is.array", String[].class));
return env.getProperty("this.is.array[0]");
}
}
@RestController
class WithValueAnnotation {
@Value("${this.is.array[0]}")
private String first;
@Value("${this.is.array}")
private List<String> list;
@Value("${this.is.array}")
private String[] array;
@RequestMapping(value = "/with_value_annotation", method = { RequestMethod.GET, RequestMethod.POST }, produces = "application/json")
public String test() {
System.err.println(first);
System.err.println(list);
System.err.println(array);
return first;
}
}
application.yml 文件
this:
is:
array:
- "casa"
- "pesenna"
结果
WithEnvCtrl.test
方法打印:
casa
null
null
null
WithValueAnnotation.test
方法正确地将变量 first
设置为数组的第一个元素 (casa
)。但是属性list
和array
上的注解@Value
导致异常:
java.lang.IllegalArgumentException: Could not resolve placeholder 'this.is.array' in string value "${this.is.array}"
这是一个示例项目:property-array。
非常感谢!
解决者:
- 使用注释
@ConfigurationProperties
; - 正在声明一个与 yml 同名的属性 属性;
- 为属性定义 get 方法;
- 正在初始化属性或定义设置方法。
这里是代码:
import java.util.List;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@RestController
@ConfigurationProperties(prefix="this.is")
class WithValueAnnotation {
private List<String> array;
public List<String> getArray(){
return this.array;
}
public void setArray(List<String> array){
this.array = array;
}
@RequestMapping(value = "/test_cfg", method = { RequestMethod.GET,
RequestMethod.POST }, produces = "application/json")
public String test() {
System.err.println(array);
return array.toString();
}
}
谢谢@Quagaar。