Значения контроллера Java Thymeleaf @ModelAttribute равны нулю, даже если указан th: object

У меня возникают проблемы с решением проблемы с Spring + Thymeleaf при отправке формы. Я создаю новый dto, когда страница загружается, и обновляю его через th: field. Однако когда я отправляю форму, я обнаруживаю, что все значения dto равны нулю. Я знаю, что задают много вопросов, но ни одно из их решений, похоже, не работает для меня.

Вот моя форма:

 <form action = "/api/v2/transaction/recurring/add" method = "post" th:object = "${rtdto}">
                            <select name = "category" id = "Tcategory" required th:field = "*{category}">
                                <option value = "NONE" disabled selected hidden>Category</option>
                                <option value = "HOUSING">Housing</option>
                                <option value = "TRANSPORTATION">Transportation</option>
                                <option value = "FOOD">Food/Drink</option>
                                <option value = "UTILITIES">Utilities</option>
                                <option value = "CLOTHING">Clothing</option>
                                <option value = "MEDICAL_HEALTHCARE">Medical/Healthcare</option>
                                <option value = "INSURANCE">Insurance</option>
                                <option value = "HOUSEHOLD_ITEMS_SUPPLIES">Household Items/Supplies</option>
                                <option value = "PERSONAL">Personal</option>
                                <option value = "ENTERTAINMENT">Entertainment</option>
                                <option value = "SUBSCRIPTION">Subscriptions</option>
                                <option value = "GROCERY">Grocery</option>
                                <option value = "MISCELLANEOUS">Miscellaneous</option>
                            </select>
                            <input type = "text" required name = "name" placeholder = "Name" autocomplete = "off" autocapitalize = "off" spellcheck = "false" th:field = "*{name}">
                            <input type = "number" step = "0.01" required name = "amt" placeholder = "Amount" autocomplete = "off" min = "0.01" th:field = "*{amount}">
                            <select name = "freq" id = "freq" required th:field = "*{period}">
                                <option value = "NONE" disabled selected hidden>Frequency</option>
                                <option value = "MONTH">Every Month</option>
                                <option value = "YEAR">Every Year</option>
                            </select>
                            <input type = "hidden" name = "callback" th:value = "${backHREF}">
                            <input type = "hidden" th:name = "${_csrf.parameterName}" th:value = "${_csrf.token}" />
                            <input type = "submit" class = "button" value = "Add">
                        </form>

Это код контроллера, в котором я инициализирую свой DTO:

@GetMapping("/settings/{callback}")
    @PreAuthorize("isAuthenticated() and hasRole('VERIFIED') and hasRole('COMPLETED')")
    public ModelAndView getSettings(@PathVariable(value = "callback", required = false) String callback, Model model) {
        ModelAndView mav = new ModelAndView("settings");
        Account account = userService.getAccount();
        mav.addObject("cssPath", Utils.Paths.Styles.INDEX_CSS_PATH)
                .addObject("backHREF", callback.equals("main") ? "" : callback)
                .addObject("accDTO", new SettingsAccountDTO(account.getFirstName(), account.getLastName(), account.getEmail(), account.getCountry()))
                .addObject("firstName", account.getFirstName())
                .addObject("recurringTransactions", transactionService.getAllRecurringTransactions())
                .addObject("rtdto", new RecurringTransactionDTO());
        if (!model.containsAttribute("message") && !model.containsAttribute("color")) {
            mav.addObject("error", "&nbsp;")
                    .addObject("color", Color.LIGHT_BACKGROUND.getColor());
        }
        if (!model.containsAttribute("messageB") && !model.containsAttribute("colorB")) {
            mav.addObject("errorB", "&nbsp;")
                    .addObject("colorB", Color.LIGHT_BACKGROUND.getColor());
        }
        if (!model.containsAttribute("messageU") && !model.containsAttribute("colorU")) {
            mav.addObject("errorU", "&nbsp;")
                    .addObject("colorU", Color.LIGHT_BACKGROUND.getColor());
        }
        if (!model.containsAttribute("messageRT") && !model.containsAttribute("colorRT")) {
            mav.addObject("errorRT", "&nbsp;")
                    .addObject("colorRT", Color.LIGHT_BACKGROUND.getColor());
        }
        return mav;
    }

Наконец, вот @PostMapping, который используется при отправке формы:

@PostMapping("/recurring/add")
    @PreAuthorize("isAuthenticated() and hasRole('COMPLETED') and hasRole('VERIFIED')")
    public ModelAndView addRecurringTransaction(RedirectAttributes attr, @ModelAttribute RecurringTransactionDTO dto, @RequestParam("callback") String callback, Model model) {
        log.info(dto.getCategory() + dto.getName() + dto.getPeriod() + dto.getAmount());
        return new ModelAndView("redirect:/settings/" + (callback.equals("") ? "main" : callback) + "#charges");
    }

Вот результат:

nullnullnullnull

Любая помощь будет оценена по достоинству!

Попробуйте изменить @ModelAttribute на @ModelAttribute("rtdto") в вашем методе @PostMapping.

Wim Deblauwe 30.03.2021 10:12

@WimDeblauwe, который, к сожалению, не сработал.

Aneesh Reddy 31.03.2021 19:13
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
21
0

Другие вопросы по теме