如何在春季启动中获取命令行参数


@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 值。

因此,在控制器或服务部分中使用此变量。

最新更新