#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
}