Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Spring data. Opcao sair de menus secundarios Encerra todo o sistema. Como resolver??

Public class Application implements CommandLineRunner {

    private Boolean system = true;
    private final CrudCargoService cargoService;
    private final CrudFuncionarioService funcionarioService;
    private final CrudUnidadeTrabalhoService unidadeTrabalhoService;

    public Application(CrudCargoService cargoService, CrudFuncionarioService funcionarioService, CrudUnidadeTrabalhoService unidadeTrabalhoService) {
        this.cargoService = cargoService;
     this.funcionarioService = funcionarioService;
     this.unidadeTrabalhoService = unidadeTrabalhoService;
  }

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

    @Override
    public void run(String... args) throws Exception {
        Scanner sc = new Scanner(System.in);
        while (system) {
            Integer function = menu(sc);
            sc.nextLine();
            switch (function) {
                case 1 -> cargoService.start();
                case 2 -> funcionarioService.start();
                case 3 -> unidadeTrabalhoService.start();
                case 4 -> cargoService.start();
                case 5 -> cargoService.start();
                case 6 -> {
                    System.out.println("Finalizando");
                    sc.close();
                    system = false;
                    System.exit(0);
                }
                default -> System.out.println("Opcão invalida. Por favor escolha uma opção valida.");
            }

        }

    }

    private Integer menu(Scanner sc){
        System.out.println("Qual função deseja executar?");
        System.out.println("1 - Cargo");
        System.out.println("2 - Funcionario");
        System.out.println("3 - Unidade");
        System.out.println("4 - Relatorios");
        System.out.println("5 - Relatorio dinamico");
        System.out.println("6 - Sair");
    return sc.nextInt();
    }
}

Esse é o main Seguindo para o menu do cargoService.Start();

public class CrudCargoService {

  private Boolean system = true;
  private final CargoRepository repository;

  public CrudCargoService(CargoRepository cargoRepository) {
    this.repository = cargoRepository;
  }

  public void start(){
    Scanner sc = new Scanner(System.in);
    while (system){
      System.out.println("Qual acao de cargo deseja executar");
      System.out.println("1 - Salvar");
      System.out.println("2 - Atualizar");
      System.out.println("3 - Visualizar");
      System.out.println("4 - Deletar");
      System.out.println("5 - Sair");

      int action = sc.nextInt();
      sc.nextLine();
      switch (action) {
        case 1 -> salvar(sc);
        case 2 -> atualizar(sc);
        case 3 -> visualizar();
        case 4 -> deletar(sc);
        case 5 -> {
          sc.close();
          system = false;
        }
        default -> System.out.println("Opcão invalida. Por favor escolha uma opção valida.");
      }


    }
  }

  private void salvar(Scanner sc){
    System.out.println("Digite o cargo que deseja salvar: ");
    String nome = sc.nextLine();
    repository.save(new Cargo(nome));
    System.out.println("Salvo");
  }

  private void atualizar(Scanner sc){
    System.out.println("Id");
    int id = sc.nextInt();
    sc.nextLine();
    System.out.println("Nome do Cargo");
    String nome = sc.nextLine();

    Cargo cargo = new Cargo(nome);
    cargo.setId(id);
    repository.save(cargo);
    System.out.println("Atualizado");
  }

  private void visualizar() {
    Iterable<Cargo> cargos = repository.findAll();
    cargos.forEach(cargo -> System.out.println(cargo));
  }

  private void deletar(Scanner sc) {
    System.out.println("Id");
    int id = sc.nextInt();
    sc.nextLine();
    repository.deleteById(id);
    System.out.println("Deletado");
  }
}

apos escolher a opcao 5, na minha opniao ele deveria voltar para o menu principal da classe application, mas ele encerra o sistema todo. Como Resolver? e depois ainda tem o problema de voltando ao menur principal qd charma cargoService.start(), ele funcionar já que a boolean em CrudCargoService vai ta como false ne?

3 respostas

Oi Luccas! Joia?

Quando você escolhe a opção "5 - Sair" no menu do CrudCargoService, o sistema está encerrando completamente porque você está fechando o Scanner e definindo a variável system como false. Isso faz com que o loop do menu principal também termine.

Para resolver isso, você pode ajustar a lógica para que, ao sair do menu secundário, ele retorne ao menu principal sem fechar o Scanner e sem encerrar o sistema. Uma maneira de fazer isso é criando um método separado para o loop do menu principal e chamando os serviços sem alterar a variável system global.

Aqui está uma sugestão:

Classe Application

public class Application implements CommandLineRunner {
    private Boolean system = true;
    private final CrudCargoService cargoService;
    private final CrudFuncionarioService funcionarioService;
    private final CrudUnidadeTrabalhoService unidadeTrabalhoService;

    public Application(CrudCargoService cargoService, CrudFuncionarioService funcionarioService, CrudUnidadeTrabalhoService unidadeTrabalhoService) {
        this.cargoService = cargoService;
        this.funcionarioService = funcionarioService;
        this.unidadeTrabalhoService = unidadeTrabalhoService;
    }

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

    @Override
    public void run(String... args) throws Exception {
        Scanner sc = new Scanner(System.in);
        while (system) {
            Integer function = menu(sc);
            sc.nextLine();
            switch (function) {
                case 1 -> cargoService.start(sc);
                case 2 -> funcionarioService.start(sc);
                case 3 -> unidadeTrabalhoService.start(sc);
                case 4 -> cargoService.start(sc);
                case 5 -> cargoService.start(sc);
                case 6 -> {
                    System.out.println("Finalizando");
                    system = false;
                }
                default -> System.out.println("Opcão invalida. Por favor escolha uma opção valida.");
            }
        }
        sc.close();
    }

    private Integer menu(Scanner sc) {
        System.out.println("Qual função deseja executar?");
        System.out.println("1 - Cargo");
        System.out.println("2 - Funcionario");
        System.out.println("3 - Unidade");
        System.out.println("4 - Relatorios");
        System.out.println("5 - Relatorio dinamico");
        System.out.println("6 - Sair");
        return sc.nextInt();
    }
}

Classe CrudCargoService

public class CrudCargoService {

    private Boolean system = true;
    private final CargoRepository repository;

    public CrudCargoService(CargoRepository cargoRepository) {
        this.repository = cargoRepository;
    }

    public void start(Scanner sc) {
        system = true; // Resetar a variável para garantir que o menu funcione novamente
        while (system) {
            System.out.println("Qual acao de cargo deseja executar");
            System.out.println("1 - Salvar");
            System.out.println("2 - Atualizar");
            System.out.println("3 - Visualizar");
            System.out.println("4 - Deletar");
            System.out.println("5 - Sair");
            int action = sc.nextInt();
            sc.nextLine();
            switch (action) {
                case 1 -> salvar(sc);
                case 2 -> atualizar(sc);
                case 3 -> visualizar();
                case 4 -> deletar(sc);
                case 5 -> system = false; // Apenas sair do menu secundário
                default -> System.out.println("Opcão invalida. Por favor escolha uma opção valida.");
            }
        }
    }
    private void salvar(Scanner sc) {
        System.out.println("Digite o cargo que deseja salvar: ");
        String nome = sc.nextLine();
        repository.save(new Cargo(nome));
        System.out.println("Salvo");
    }

    private void atualizar(Scanner sc) {
        System.out.println("Id");
        int id = sc.nextInt();
        sc.nextLine();
        System.out.println("Nome do Cargo");
        String nome = sc.nextLine();

        Cargo cargo = new Cargo(nome);
        cargo.setId(id);
        repository.save(cargo);
        System.out.println("Atualizado");
    }

    private void visualizar() {
        Iterable<Cargo> cargos = repository.findAll();
        cargos.forEach(cargo -> System.out.println(cargo));
    }

    private void deletar(Scanner sc) {
        System.out.println("Id");
        int id = sc.nextInt();
        sc.nextLine();
        repository.deleteById(id);
        System.out.println("Deletado");
    }
}

Dessa forma, ao escolher a opção "5 - Sair" no menu do CrudCargoService, ele apenas sai do menu secundário e retorna ao menu principal, sem fechar o Scanner ou encerrar todo o projeto.

Valeuuuuu mesmo Obrigado, entendi a parte do de resetar o system = true, o professor e a parte do sc.close pq encerra o sistema todo? no exemplo do senhor vc ta passando o sc por parametro do menu principal para os secundario, no meu caso eu inicie eles no propio escopo do metodo start, tem diferença? ou fechando um fecha todos? Muito obrigado pelo exemplo, consegui entender melhor! só essa parte do Scanner ainda nao entendi direito.

solução!

Opa, Luccas! Fico feliz que tenha lhe ajudado.

Agora sobre as suas outras dúvidas.

Quando você chama sc.close(), o Scanner fecha a entrada padrão do sistema (System.in), o que impede qualquer leitura subsequente de entrada do usuário e pode causar exceções. Portanto, fechar o Scanner antes do final do programa principal faz com que o sistema todo encerre a leitura de entrada.

A melhor prática é criar um único Scanner no início da aplicação e passá-lo para os métodos conforme necessário. Isso mantém a entrada aberta durante todo o ciclo de vida da aplicação, evitando problemas ao fechar a entrada padrão prematuramente. Assim, só feche o Scanner quando a aplicação estiver realmente terminando.

Caso tenha mais dúvidas estarei à disposição.