Как получить аргументы командной строки при весенней загрузке?

@SpringBootApplication
public class CommandLinetoolApplication {

@Value("${person.name}")
private String name;

public static void main(String... argv) {
    SpringApplication.run(CommandLinetoolApplication.class, argv);
 }  
}

Я использую eclipse, поэтому устанавливаю конфигурацию запуска как
-Dspring-boot.run.arguments=--person.name=имя

Но при запуске моего приложения я получаю исключение, поскольку "Не удалось разрешить заполнитель "person.name" в значении "${person.name}"

memorynotfound.com/…
burm87 26.04.2019 15:14

@ burm87 Это первая ссылка, если вы погуглите, как передать аргументы командной строки при весенней загрузке. Я прошел через это.

Dhanraj 26.04.2019 15:17

Может проблема в том, что @Value находится в основном классе. Вы пытались добавить его, например, в класс контроллера?

burm87 26.04.2019 15:19

Ссылка на документы: docs.spring.io/spring-boot/docs/2.1.x/reference/html/…

MarkHu 16.09.2021 19:35
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
14
4
44 953
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вам нужно добавить свойство конфигурации person.name=firstName в свой application.properties

ИЛИ

Реализовать интерфейс 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);
    }
}

Вывод: - NonOptionArgs: [-Dspring-boot.run.arguments=--person.name=Name] OptionNames: []Contains person.name: false

Dhanraj 26.04.2019 15:40

person.name имеет значение false..почему?Моя конфигурация запуска -Dspring-boot.run.arguments=--person.name=Name

Dhanraj 26.04.2019 15:42

если я установлю конфигурацию запуска как --person.name=Имя, это станет правдой. Но при весенней загрузке мы не передаем такой аргумент

Dhanraj 26.04.2019 15:45

Вы только скопировали этот код из memorynotfound.com/…

Dhanraj 26.04.2019 15:47
@Value("${person.name}") не читается для командной строки. Он читается из application.properties
abj1305 26.04.2019 15:52

Да.. Тогда достанется это имущество?

Dhanraj 26.04.2019 15:54

Чтобы получить свойство из командной строки, реализуйте интерфейс ApplicationRunner.

abj1305 26.04.2019 15:58

Неужели нет другого пути?

Dhanraj 26.04.2019 16:07

О других способах можно узнать на странице связь.

abj1305 26.04.2019 16:19

Вам нужно изменить аргументы виртуальной машины затмения как -Dperson.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

могу ли я использовать ${persion.name} внутри аннотации @importresource

arj 29.10.2019 13:38

А если я хочу передать несколько параметров с одинаковой логикой?? Я пытаюсь что-то вроде -Dspring-boot.run.arguments=--person.name=Test --person.surname=Test2, но не работает

CoderJammer 24.05.2020 21:50

Spring boot app - это JAR-файл, который выполняется в системах без установленного maven...

Oleg Mikheev 14.12.2020 04:17

Другие вопросы по теме