RequestParam w RequestMethod.POST - jak to zastąpić.

0

Witam,
Mam dwie klasy Project i Task w relacji jeden do wielu. Najpierw w formularzu dodaje sobie projekt, w kolejnym dodaje sobie do niego zadania. Formularz się wyświetla i zadanie się dodaje, tylko relacja się nie zapisuje, idProject jest null. Te 3 linię w komentarzu, pewnie powinny być w post, tylko skąd tam id projektu wziąć?

    @RequestMapping(value = "/add", method = RequestMethod.GET)
    public String getAddNewTaskForm(Model model, @RequestParam("idProject") Long id) {
        Task newTask = new Task();
//        Project project = projectService.findById(id);
//        newTask.setProject(project);
//        projectService.update(project);
        model.addAttribute("newTask", newTask);
        return "addTask";
    }

    @RequestMapping(value = "/add", method = RequestMethod.POST)
    public String processAddNewTaskForm(@ModelAttribute("newTask") Task
                                                   newTask, BindingResult result) {

        String[] suppressedFields = result.getSuppressedFields();
        if (suppressedFields.length > 0) {
            throw new RuntimeException("Próba wiązania niedozwolonych pól: " + StringUtils.arrayToCommaDelimitedString(suppressedFields));
        }
        taskService.save(newTask);
        return "redirect:all";

    }

Formularz

      <form:form modelAttribute="newTask" cssClass="form-register">

        <div class="form-group">
          <label for="name" class="col-sm-2 control-label">Nazwa</label>

          <div class="col-sm-10">
            <form:input path="name" cssClass="form-control"/>
          </div>
        </div>

        <div class="form-group">
          <label for="description" class="col-sm-2 control-label">Opis</label>

          <div class="col-sm-10">
            <form:textarea path="description" cssClass="form-control"/>
          </div>
        </div>

        <div class="form-group">
          <label for="dateStart" class="col-sm-2 control-label">Data: </label>

          <div class="col-sm-10">
            <form:input type="date" path="dateStart" cssClass="form-control"/>
          </div>
        </div>

        <div class="form-group">
          <label for="dateEnd" class="col-sm-2 control-label">Data: </label>
          <div class="col-sm-10">
            <form:input type="date" path="dateEnd" cssClass="form-control"/>
          </div>
        </div>

        <div class="form-group">
          <div class="col-sm-12">
            <input type="submit" value="<spring:message code="page.save"/>"
                   class="btn btn-lg btn-primary pull-right"/>
          </div>
        </div>
      </form:form>
 

Wybór projektu:
pracaP1.PNG

A tutaj tabela zadań z bazy.
PracaP2.PNG

0

Znalazłem rozwiązanie. Działa, tylko czy tak to powinno się robić?

    @RequestMapping(value = "/add", method = RequestMethod.POST)
    public String processAddNewTaskForm(HttpServletRequest request, @ModelAttribute("newTask") Task
                                                   newTask, BindingResult result) {

        String id = request.getParameter("idProject");
        Project project = projectService.findById(Long.parseLong(id));
        newTask.setProject(project);


        String[] suppressedFields = result.getSuppressedFields();
        if (suppressedFields.length > 0) {
            throw new RuntimeException("Próba wiązania niedozwolonych pól: " + StringUtils.arrayToCommaDelimitedString(suppressedFields));
        }
        taskService.save(newTask);
        projectService.update(project);
        return "redirect:all";
    } 
0

Mogłeś dodać jako parametr metody @RequestParam("idProject") Long id -> Lub użyć jakiegoś property editora na bindingu, lub konwertera, który pozwoliłby Ci od razu na @RequestParam("idProject") Project project

1 użytkowników online, w tym zalogowanych: 0, gości: 1