Boa tarde! Fiz um método atualizar diferente do que foi usado pelo professor, também dei um jeito de conseguir digitar espaço na descrição mas acho que foi pura gambiarra.
SpringDataApplication método run
@Override
public void run(String... args) throws Exception {
Scanner scanner = new Scanner(System.in);
while (system) {
System.out.println("Selecione uma opção.");
System.out.println("[0] - Sair");
System.out.println("[1] - Cargo");
System.out.println("[2] - Editar Cargo");
int action = scanner.nextInt();
switch(action) {
case 1:
cargoService.inicial(scanner);
break;
case 2:
System.out.println("[1] - Buscar por nome");
System.out.println("[2] - Buscar por ID");
action = scanner.nextInt();
if(action == 1) {
Cargo cargo = cargoService.buscarPorDescricao(scanner);
cargoService.atualizar(cargo, scanner);
} else if (action == 2) {
Cargo cargo = cargoService.buscarPorId(scanner);
cargoService.atualizar(cargo, scanner);
}
break;
default:
system = false;
break;
}
}
scanner.close();
}
CrudCargoService
public class CrudCargoService {
private final CargoRepository cargoRepository;
public CrudCargoService(CargoRepository cargoRepository) {
this.cargoRepository = cargoRepository;
}
public void inicial(Scanner scanner) {
salvar(scanner);
}
private void salvar(Scanner scanner) {
System.out.println("Descrição de cargo.");
String descricao = scanner.next();
Cargo cargo = new Cargo();
cargo.setDescricao(descricao);
cargoRepository.save(cargo);
}
public void atualizar(Cargo cargo, Scanner scanner) {
System.out.println("Nova descrição para o cargo");
String novaDescricao = scanner.nextLine();
novaDescricao = scanner.nextLine();
cargo.setDescricao(novaDescricao);
cargoRepository.save(cargo);
}
public Cargo buscarPorId(Scanner scanner) {
System.out.println("Digite o ID do cargo a ser atualizado: ");
int id = scanner.nextInt();
Optional<Cargo> optionalCargo = cargoRepository.findById(id);
Cargo cargo = optionalCargo.get();
return cargo;
}
public Cargo buscarPorDescricao(Scanner scanner) {
System.out.println("Digite a descrição do cargo: ");
String descricao = scanner.nextLine();
descricao = scanner.nextLine();
Cargo cargo = cargoRepository.findByDescricao(descricao);
return cargo;
}
}
Para buscar pela linha inteira inclusive o espaço eu tive que usar o scanner.nextLine() duas vezes, não tenho certeza do motivo mas acho que ele lê o output dos sysout e trata como valor ou sei lá.
Para buscar por nome, foi necessário adicionar um método à interface repository, com isso o próprio spring consegue abstrair e entender que é a descrição que você está procurando.
@Repository
public interface CargoRepository extends CrudRepository<Cargo, Integer> {
public Cargo findByDescricao(String descricao);
}