Получать ввод из командной строки с помощью Spring Boot - PullRequest
0 голосов
/ 29 мая 2019

Итак, у меня есть очень маленькое приложение командной строки Spring Boot (нет встроенного сервера Tomcat или чего-либо, что могло бы сделать его веб-приложением) с единственным классом, в котором я пытаюсь использовать Scannerкласс из java.util для чтения ввода от пользователя.Это не работает вообще.Я думал, что это будет довольно простой материал в Spring Boot, но все мои поиски как по SO, так и по учебникам не дали результатов.Какой лучший способ пойти по этому поводу?или Spring Boot просто не для того, что я хочу сделать?

Вот мой класс:

package test;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import java.util.Scanner;

@SpringBootApplication
public class MyApplication implements CommandLineRunner {

    private static Logger LOG = LoggerFactory
        .getLogger(MyApplication.class);

    public static void main(String[] args) {
        SpringApplication app = new SpringApplication(MyApplication.class);
        app.run(args);
    }

    @Override
    public void run(String... args) throws Exception {
        LOG.info("EXECUTING : command line runner");

        Scanner in = new Scanner(System.in);

        System.out.println("What is your name?");
        String name = in.next();
        System.out.println("Hello " + name + " welcome to spring boot" );
    }
}

Исключение, которое выдается:

2019-05-29 11:31:29.116  INFO 4321 --- [           main] test.MyApplication  : EXECUTING : command line runner
2019-05-29 11:31:29.119  INFO 4321 --- [           main] ConditionEvaluationReportLoggingListener : 

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2019-05-29 11:31:29.124 ERROR 4321 --- [           main] o.s.boot.SpringApplication               : Application run failed

java.lang.IllegalStateException: Failed to execute CommandLineRunner
        at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:816) ~[spring-boot-2.1.5.RELEASE.jar:2.1.5.RELEASE]
        at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:797) ~[spring-boot-2.1.5.RELEASE.jar:2.1.5.RELEASE]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:324) ~[spring-boot-2.1.5.RELEASE.jar:2.1.5.RELEASE]
        at com.jaletechs.png.PrimeNumberGeneratorApplication.main(MyApplication.java:19) [main/:na]
Caused by: java.util.NoSuchElementException: null
        at java.util.Scanner.throwFor(Scanner.java:862) ~[na:1.8.0_201]
        at java.util.Scanner.next(Scanner.java:1371) ~[na:1.8.0_201]
        at test.MyApplication.run(MyApplication.java:27) [main/:na]
        at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:813) ~[spring-boot-2.1.5.RELEASE.jar:2.1.5.RELEASE]
        ... 3 common frames omitted

Ответы [ 3 ]

2 голосов
/ 29 мая 2019

Пружинная загрузка не предназначена для любого вида использования общего назначения. У него есть конкретные цели. Мы не всегда должны думать о том, как использовать Spring Boot для каких-либо требований. Я знаю, что Spring Boot стал очень популярным. На ваш вопрос, если вы хотите создать интерактивное приложение / программу, вы должны сделать это простым способом. Я просто предоставляю ниже фрагмент кода.

public class Interactive
{

  public static void main (String[] args)
  {
    // create a scanner so we can read the command-line input
    Scanner scanner = new Scanner(System.in);
    System.out.print("Enter your name ? ");
    String username = scanner.next();
    System.out.print("Enter your age ? ");
    int age = scanner.nextInt();

    //Print all name, age etc
  }

}

Надеюсь, что это может быть вашим требованием. Опять же, приложение Spring Boot нельзя назвать интерактивным в истинном смысле. Есть много интерпретаций. Spring Boot подходит для клиент-серверной архитектуры.

2 голосов
/ 29 мая 2019

или Spring Boot просто не для того, что я хочу сделать?

Вы правы.

Приложение Spring Boot является серверным (как и любое другое).война) и работает во встроенном Tomcat.Что это за сканер здесь?

Если вы хотите с ним взаимодействовать - вы должны создать контроллер REST и отправлять / получать данные через конечные точки.

0 голосов
/ 29 мая 2019

Итак, я нашел способ заставить его работать, попробовав обычное приложение gradle (не весеннюю загрузку).Я столкнулся с той же проблемой, и решением было добавить строку в мой build.gradle файл для подключения по умолчанию stdin

В обычном Java-приложении Gradle:

run {
    standardInput = System.in
}

но в приложении Spring Boot я добавил следующую строку:

bootRun {
    standardInput = System.in
}

Оказывается, что Spring Boot может обрабатывать приложение командной строки в конце концов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...