Приложение Spring boot console и пользовательский ввод не работают

#spring-boot

#spring-boot

Вопрос:

Я использую spring boot 2, я пытаюсь создать базовое консольное приложение. Когда это начнется, я хотел бы получить некоторый ввод от пользователя

 @SpringBootApplication
public class ConsoleApplication implements CommandLineRunner {
    ...

    @Override
    public void run(String... args) throws Exception {

        Scanner reader = new Scanner(System.in);

        System.out.println("Enter file file path");
        this.filePath = reader.next();

        ...
    }

    public static void main(String[] args) {
        SpringApplication.run(ConsoleApplication.class, args);
    }

}
  

Когда я пытаюсь его запустить

java.lang.Исключение IllegalStateException: не удалось выполнить CommandLineRunner в org.springframework.boot.SpringApplication.callRunner(SpringApplication.java: 795) [spring-boot-2.0.8.RELEASE.jar:2.0.8.RELEASE] в org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:776) [spring-boot-2.0.8.RELEASE.jar:2.0.8.RELEASE] в org.springframework.boot.SpringApplication.run(SpringApplication.java:315) [spring-boot-2.0.8.RELEASE.jar:2.0.8.RELEASE] в org.springframework.boot.SpringApplication.run(SpringApplication.java:1242) [spring-boot-2.0.8.RELEASE.jar:2.0.8.RELEASE] в org.springframework.boot.SpringApplication.run(SpringApplication.java:1230) [spring-boot-2.0.8.RELEASE.jar:2.0.8.RELEASE] на com.sita.geodb.GeoDbApplication.main(GeoDbApplication.java:175) [main/:na] Вызвано: java.util.NoSuchElementException: null в java.util.Scanner.throwFor(Scanner.java:862) ~ [na:1.8.0_131] в java.util.Scanner.next(Scanner.java:1371) ~ [na:1.8.0_131] на com.sita.geodb.GeoDbApplication.run(GeoDbApplication.java:138) [main/:na] в org.springframework.boot.SpringApplication.callRunner (SpringApplication.java: 792) [spring-boot-2.0.8.RELEASE.jar:2.0.8.RELEASE] … 5 общих фреймов опущены

Комментарии:

1. Вы когда-нибудь находили способ сделать это? Я застрял, пытаясь получить ввод от пользователя, но это просто не получается.

Ответ №1:

То, что вы предоставили, выглядит правильно. Я создал образец, который работает таким же образом. Должно быть что-то еще, что вы не показываете о своей реализации.

 import java.util.Scanner;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class ConsoleApplication implements CommandLineRunner {

   @Override
   public void run(String... args) throws Exception {
       Scanner scanner = new Scanner(System.in);

       System.out.println("What your name?");
       String name=null;
       if (scanner.hasNext()) {
            name = scanner.nextLine();
       } 
       System.out.println("Hello "  name);  
   }

   public static void main(String[] args) {
      SpringApplication.run(ConsoleApplication.class, args);
   }
}
  

Ответ №2:

Пожалуйста, добавьте следующую строку в ваш файл build.gradle (при условии, что вы используете gradle в качестве инструмента сборки):

 bootRun {
    standardInput = System.in
}
  

Эта линия подключает стандартный stdin к System.in

Ответ №3:

Недавно была такая же проблема при использовании Spring. Ответ @ jaletechs подсказал мне правильное направление.
Но мне пришлось использовать hasNextLine() , чтобы заставить это работать.
Итак, в моем случае:

 @Service
public class SomeClass {

@PostConstruct
public void start() throws InterruptedException {
   final Scanner scanner = new Scanner(System.in);
   if (scanner.hasNextLine()) {
          String input = scanner.nextLine();
          System.out.println(input);
       }
   }
}
  

А затем с помощью настройки @jaletechs для build.gradle для подключения стандартного ввода к System.in:

 bootRun {
   standardInput = System.in
}