@SpringBootApplication
public class CommandLinetoolApplication {
@Value("${person.name}")
private String name;
public static void main(String... argv) {
SpringApplication.run(CommandLinetoolApplication.class, argv);
}
}
我正在使用日食,因此将运行配置
设置为 -dspring-boot.run.arguments=--person.name=firstName
但是当运行我的应用程序时,我得到异常 "无法解析值"${person.name}"中的占位符'person.name'
这段代码工作得很好(Spring Boot 2.1.4(:
@SpringBootApplication
public class DemoApplication implements ApplicationRunner
{
@Value("${person.name}")
private String name;
public static void main( String[] args )
{
SpringApplication.run( DemoApplication.class, args );
}
@Override
public void run( ApplicationArguments args ) throws Exception
{
System.out.println( "Name: " + name );
}
}
命令行:
mvn spring-boot:run -Dspring-boot.run.arguments=--person.name=Test
输出:
. ____ _ __ _ _
/\ / ___'_ __ _ _(_)_ __ __ _
( ( )___ | '_ | '_| | '_ / _` |
\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |___, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.1.4.RELEASE)
2019-04-28 22:51:09.741 INFO 73751 --- [ main] com.example.demo.DemoApplication : Starting DemoApplication on xxx-MacBook-Pro.local with PID 73751 (/Users/strelok/code/demo-sb/target/classes started by strelok in /Users/strelok/code/demo-sb)
2019-04-28 22:51:09.745 INFO 73751 --- [ main] com.example.demo.DemoApplication : No active profile set, falling back to default profiles: default
2019-04-28 22:51:10.943 INFO 73751 --- [ main] com.example.demo.DemoApplication : Started DemoApplication in 16.746 seconds (JVM running for 23.386)
Name: Test
在application.properties
中添加配置属性person.name=firstName
或
实现接口ApplicationRunner
并覆盖其run
方法(正确的命令行参数读取方法(
例:
@SpringBootApplication
public class Application implements ApplicationRunner {
private static final Logger logger = LoggerFactory.getLogger(Application.class);
public static void main(String... args) throws Exception {
SpringApplication.run(Application.class, args);
}
@Override
public void run(ApplicationArguments args) throws Exception {
logger.info("Application started with command-line arguments: {}", Arrays.toString(args.getSourceArgs()));
logger.info("NonOptionArgs: {}", args.getNonOptionArgs());
logger.info("OptionNames: {}", args.getOptionNames());
for (String name : args.getOptionNames()){
logger.info("arg-" + name + "=" + args.getOptionValues(name));
}
boolean containsOption = args.containsOption("person.name");
logger.info("Contains person.name: " + containsOption);
}
}
将 eclipse VM 参数更改为 -Dperson.name=dhanraj
还有一件事是没有用的,在主类中添加私有字符串名称。因为main方法是静态方法,所以需要创建对象来访问名称变量和最终的新对象会给你空值,而不是你设置的 dhanraj 值。
因此,在控制器或服务部分中使用此变量。