2 years ago

#55783

test-img

faebie

Model attribute inconsistent after form submission

I'm still trying to figure out what's happening on the backend here. Working with Spring Boot/Thymeleaf. I have a form template that updates a model attribute object on save. I'm trying to use the updated values on the backend, however it's inconsistent among my functions and I'm not sure why.

Thymeleaf template

<div layout:fragment="content" class="container">
  <form action="#" th:action="@{/utility/exportbadges}" th:object="${badgeExport}" method="post">
    <div class="form-group col-md-6">
      <label class="col-form-label-sm">Badge type</label>
      <select th:field="*{type}" class="form-control">
        <option th:each="badgeType : ${T(org.myorg.myproject.model.badge.BadgeType).values()}"
                th:value="${badgeType}"
                th:text="${badgeType}">
        </option>
      </select>
    </div>

    <div class="form-group col-md-3">
      <label class="col-form-label-sm">Use background?</label>
      <input type="checkbox" th:field="*{background}" class="form-control">
    </div>

    <div class="form-group col-md-3">
      <label class="col-form-label-sm">Mark preprinted?</label>
      <input type="checkbox" th:field="*{preprinted}" class="form-control">
    </div>

    <div class="form-group col-md-3">
      <label class="col-form-label-sm">Save to path (/tmp default):</label>
      <input type="text" th:field="*{saveDir}" class="form-control" placeholder="/tmp">
    </div>

    <div class="form-group col-md-12 mt-2">
      <div class="col-sm-10">
        <input class="btn btn-primary" id="save" type="submit" value="Export" />
        <input class="btn btn-secondary" type="reset" value="Reset" />
      </div>
    </div>
  </form>
</div>
    @RequestMapping(value = "/utility/exportbadges")
    public String exportBadges(Model model) {
        final BadgeExport badgeExport = new BadgeExport();
        model.addAttribute("badgeExport", badgeExport);

        return "utility/exportbadges";
    }

POST method. The object is correct in this function. Any field that's edited in the form above reflects in this function. However, on redirect, the object is as if it only has default instantiation/has been unedited.

    @RequestMapping(value = "/utility/exportbadges", method = RequestMethod.POST)
    public String exportBadgeFlow(Model model,
                                  @ModelAttribute("badgeExport") final BadgeExport badgeExport) {
        log.info("BadgeExport badge type: {}", badgeExport.getType());
        log.info("BadgeExport save dir pre export: {}", badgeExport.getSaveDir());

        switch(badgeExport.getType()) {
            case "Attendee":
                log.error("Attendee export not yet implemented");
                break;
            case "Vip":
                return "redirect:exportbadges/vip-badges.pdf";
            case "Specialty":
                return "redirect:exportbadges/specialty-badges.pdf";
            case "Staff":
                return "redirect:exportbadges/staff-badges.pdf";
            case "Guest":
                return "redirect:exportbadges/guest-badges.pdf";
        }

        return "redirect:exportbadges";
    }

Redirect function. Badge type will be null and saveDir will be /tmp as default instead of updated value in form.

    @RequestMapping(value = "/utility/exportbadges/vip-badges.pdf")
    public ResponseEntity<String> getAllVipBadgePdf(@ModelAttribute("badgeExport") final BadgeExport badgeExport) throws IOException {

        log.info("BadgeExport badge type: {}", badgeExport.getType());
        log.info("BadgeExport save dir during export: {}", badgeExport.getSaveDir());
}

spring-boot

thymeleaf

spring-thymeleaf

0 Answers

Your Answer

Accepted video resources