Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Persistir dados em select do html

Não sei se têm como me ajudarem, pois estou fazendo uma página um pouco diferente daquela do curso.

Na qual, o meu form tem um select. Não é um select normal, pois ele é populado com dados vindo do banco. Representados por uma classe "SubjectArea" e guardados como um parâmetro "cargo" do objeto "newQuesitonDTO":

 <div class="form-group d-flex flex-column">
            <label>Cargo</label>
                <select class="form-select" aria-label="Select engineer area" name="cargo" th:field="*{cargo}" >
                  <option value="1" th:each="sarea: ${areas}"
                          th:value="${sarea.id}" th:text="${sarea.name}">One</option>
            </select>
      </div>

Consegui fazer o select.

Dai, quando eu faço a validação dos campos e dá um erro. O spring manda os dados já preenchidos de volta para a página do form. No entanto, a persistência só funciona nos campos de input e de textarea. Os campos selects não conseguem nem carregar o conteúdo original. Eles ficam vazios.

Exemplo dos selects quando abro a página inicialmente: Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Como os selects ficam depois de voltarem da validação:

Insira aqui a descrição dessa imagem para ajudar na acessibilidadeO controller está assim:

@Controller
@RequestMapping("/question-form")
public class QuestionFormController {
  @Autowired
  private QuestionRepository questionRepository;
  @Autowired
  BancaRepository bancaRepository;
  @Autowired
  SubjectAreaRepository subjectAreaRepository;

  @GetMapping
  public String form(Model model, NewQuestionDTO newQuestionDTO) {

    List<SubjectArea> areas = subjectAreaRepository.findAll();
    List<Banca> bancas = bancaRepository.findAll();

    model.addAttribute("areas",areas);
    model.addAttribute("bancas",bancas);
    return "question-form";
  }
  @PostMapping
  public String insert(@Valid NewQuestionDTO newQuestion, BindingResult bindingResult){
    if(bindingResult.hasErrors()) {
      return "question-form";
    }

    Question question = newQuestion.toQuestion();
    questionRepository.save(question);

    return "questions-list";
  }
}

Se alguém tiver alguma dica ai, será muito bem vinda. =)

A melhor solução que encontrei por enquanto foi de fazer a validação pelo frontend.

1 resposta
solução!

Achei a solução aqui:

https://stackoverflow.com/questions/67385150/html-select-option-does-not-work-after-validation-error-in-thymeleaf-springboot

Tem que adicionar novamente os atributos do select. No meu caso o controller ficou assim:

@Controller
@RequestMapping("/question-form")
public class QuestionFormController {
  @Autowired
  private QuestionRepository questionRepository;
  @Autowired
  BancaRepository bancaRepository;
  @Autowired
  SubjectAreaRepository subjectAreaRepository;

  @GetMapping
  public String form(Model model, NewQuestionDTO newQuestionDTO) {

    injectListFromBD(model);
    return "question-form";
  }

  private void injectListFromBD(Model model) {
    List<SubjectArea> areas = subjectAreaRepository.findAll();
    List<Banca> bancas = bancaRepository.findAll();
    model.addAttribute("areas",areas);
    model.addAttribute("bancas",bancas);
  }

  @PostMapping
  public String insert(@Valid NewQuestionDTO newQuestionDTO, BindingResult bindingResult, Model model){
    if(bindingResult.hasErrors()) {
      injectListFromBD(model);
      return "question-form";
    }

    Question question = newQuestionDTO.toQuestion();
    questionRepository.save(question);

    return "redirect:/questions-list";
  }
}