“Application.yml参数注入到数组”的版本间的差异
跳到导航
跳到搜索
Jihongchang(讨论 | 贡献) (建立内容为“1”的新页面) |
Jihongchang(讨论 | 贡献) |
||
(未显示同一用户的2个中间版本) | |||
第1行: | 第1行: | ||
− | 1 | + | === 首先,因为 @Value 的实现机制,下面这种注入是不支持的 === |
+ | |||
+ | ==== application.yml ==== | ||
+ | <syntaxhighlight lang="yaml"> | ||
+ | include: | ||
+ | - E:\record\2022 | ||
+ | - E:\record\2023 | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ==== Application.java ==== | ||
+ | <syntaxhighlight lang="java"> | ||
+ | @SpringBootApplication | ||
+ | @Slf4j | ||
+ | @Data | ||
+ | public class Application implements CommandLineRunner { | ||
+ | |||
+ | @Value("${include}") | ||
+ | String[] include; | ||
+ | |||
+ | public static void main(String[] args) { | ||
+ | log.info("STARTING THE APPLICATION"); | ||
+ | SpringApplication.run(Application.class, args); | ||
+ | log.info("APPLICATION FINISHED"); | ||
+ | } | ||
+ | |||
+ | @Override | ||
+ | public void run(String... args) { | ||
+ | |||
+ | for (String str:include) { | ||
+ | log.info(str); | ||
+ | } | ||
+ | |||
+ | } | ||
+ | |||
+ | } | ||
+ | </syntaxhighlight>会报错:<syntaxhighlight lang="console"> | ||
+ | …… | ||
+ | Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'include' in value "${include}" | ||
+ | at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:178) ~[spring-core-5.3.1.jar:5.3.1] | ||
+ | at org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders(PropertyPlaceholderHelper.java:124) ~[spring-core-5.3.1.jar:5.3.1] | ||
+ | at org.springframework.core.env.AbstractPropertyResolver.doResolvePlaceholders(AbstractPropertyResolver.java:239) ~[spring-core-5.3.1.jar:5.3.1] | ||
+ | …… | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | |||
+ | === 可以作为对象的属性注入 === | ||
+ | |||
+ | ==== application.yml ==== | ||
+ | <syntaxhighlight lang="yaml"> | ||
+ | args: | ||
+ | include: | ||
+ | - E:\record\2022 | ||
+ | - E:\record\2023 | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | |||
+ | |||
+ | ==== Args.java ==== | ||
+ | <syntaxhighlight lang="java"> | ||
+ | @Component | ||
+ | @ConfigurationProperties(prefix="args") | ||
+ | @Data | ||
+ | public class Args { | ||
+ | |||
+ | private String[] include; | ||
+ | |||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ==== Application.java ==== | ||
+ | <syntaxhighlight lang="java"> | ||
+ | @SpringBootApplication | ||
+ | @Slf4j | ||
+ | @Data | ||
+ | public class Application implements CommandLineRunner { | ||
+ | |||
+ | |||
+ | @Autowired | ||
+ | Args args; | ||
+ | |||
+ | public static void main(String[] args) { | ||
+ | log.info("STARTING THE APPLICATION"); | ||
+ | SpringApplication.run(Application.class, args); | ||
+ | log.info("APPLICATION FINISHED"); | ||
+ | } | ||
+ | |||
+ | @Override | ||
+ | public void run(String... args) { | ||
+ | |||
+ | log.info("EXECUTING : command line runner"); | ||
+ | for (String str:this.args.getInclude()) { | ||
+ | log.info(str); | ||
+ | } | ||
+ | |||
+ | } | ||
+ | |||
+ | } | ||
+ | </syntaxhighlight> |
2023年1月26日 (四) 10:18的最新版本
首先,因为 @Value 的实现机制,下面这种注入是不支持的
application.yml
include:
- E:\record\2022
- E:\record\2023
Application.java
@SpringBootApplication
@Slf4j
@Data
public class Application implements CommandLineRunner {
@Value("${include}")
String[] include;
public static void main(String[] args) {
log.info("STARTING THE APPLICATION");
SpringApplication.run(Application.class, args);
log.info("APPLICATION FINISHED");
}
@Override
public void run(String... args) {
for (String str:include) {
log.info(str);
}
}
}
会报错:
……
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'include' in value "${include}"
at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:178) ~[spring-core-5.3.1.jar:5.3.1]
at org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders(PropertyPlaceholderHelper.java:124) ~[spring-core-5.3.1.jar:5.3.1]
at org.springframework.core.env.AbstractPropertyResolver.doResolvePlaceholders(AbstractPropertyResolver.java:239) ~[spring-core-5.3.1.jar:5.3.1]
……
可以作为对象的属性注入
application.yml
args:
include:
- E:\record\2022
- E:\record\2023
Args.java
@Component
@ConfigurationProperties(prefix="args")
@Data
public class Args {
private String[] include;
}
Application.java
@SpringBootApplication
@Slf4j
@Data
public class Application implements CommandLineRunner {
@Autowired
Args args;
public static void main(String[] args) {
log.info("STARTING THE APPLICATION");
SpringApplication.run(Application.class, args);
log.info("APPLICATION FINISHED");
}
@Override
public void run(String... args) {
log.info("EXECUTING : command line runner");
for (String str:this.args.getInclude()) {
log.info(str);
}
}
}