Как привязать атрибут объекта к скрытому полю с помощью ThymeLeaf?

HTML - шаблон ThymeLeaf:

<form th:action = "@{/gustos}" method = "post" th:object = "${gusto}">
    <div class = "col s12 l8">
                    <select th:field = "*{categoria}">
                        <option value = "" disabled = "disabled">Categoria</option>
                        <option value = "Dulces de Leche">Dulce de Leche</option>
                        <option value = "Cremas">Cremas</option>
                        <option value = "Chocolates">Chocolates</option>
                        <option value = "Frutales">Frutales</option>
                    </select>
    </div>
</form>

Это мои атрибуты класса Java Смак:

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @Column
    private int idCategoria;

    @Column
    private String categoria;

    @Column // opcional (name = "")
    private String nombre;

Мне нужно, чтобы значение int idCategoria в моем классе Смак принимало значение 1, если первый вариант (Dulce de Leche) выбран пользователем, 2 для второго, 3 для третьего и 4 для четвертого, но я не знаю, как это сделать с ThymeLeaf !! Эта логика основана на атрибуте категория, если категория соответствует определенному имени, тогда идентификатор категории будет определенным числом ... ПРИМЕР: если категория равна «Dulces de Leche», идентификатор категории должен быть «1» !!!

¡Обратите внимание, что я использую привязку объекта в верхней части формы!

Я пробовал это:

  <div th:field = "*{idCategoria}">
            <div th:switch = "*{categoria}">
                <input type = "hidden" th:case = "'Dulces de Leche'" value = "1" />
                <input type = "hidden" th:case = "'Cremas'" value = "2" />
                <input type = "hidden" th:case = "'Chocolates'" value = "3" />
                <input type = "hidden" th:case = "'Frutales'" value = "4" />
            </div>
  </div>

но это не работает !!! Я хочу сделать логику в шаблоне !!

Как я могу это сделать ?

Большое спасибо всем <3

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

Ответы 2

Попробуйте это:

<select th:field = "*{categoria}">
    <option th:value = "" disabled = "disabled">Categoria</option>
    <option th:value = "1" th:text = "Dulces de Leche"></option>
    <option th:value = "2" th:text = "Cremas"></option>
    <option th:value = "3" th:text = "Chocolates"></option>
    <option th:value = "4" th:text = "Frutales"></option>
</select>

Таким образом, когда вы получаете значения через свой бэкэнд, это будет 1, 2 или 3

Спасибо за ответ ... Для этого мне все еще нужны значения th: field = "* {category}" !!! Есть ли способ получить два значения из поля th: и привязать их к разным атрибутам?

Nacho Zve De La Torre 26.10.2018 17:35

Может быть, я не ясно выражаюсь ... извините :( Мне нужно, чтобы то, что вы указали как th: text, было привязано к другому атрибуту из моего объекта Gusto (в данном случае это атрибут "categoryoria"). Это работает нормально! Что мне нужно, так это указать ДРУГОЕ значение, значения 1, 2, 3 и 4 для атрибута idCategoria .... Могу ли я передать более одного значения в поле th :? value и bing первый параметр с первым th: value и второй параметр со вторым th: value ??

Nacho Zve De La Torre 26.10.2018 17:43

Может как то так ??? <select th: field = "* {category, idCategoria}"> <option value = "" disabled = "disabled"> Категория </option> <option th: value = "Dulces de Leche" th: value = "1" > Dulce de Leche </option> <option th: value = "Cremas" th: value = "2"> Кремы </option> <option th: value = "Chocolates" th: value = "3"> Конфеты </ option> <option th: value = "Frutales" th: value = "4"> Frutales </option> </select>

Nacho Zve De La Torre 26.10.2018 17:46

Вы не можете передать более одного значения опции (потому что она называется опцией). Вы можете обойти это, используя некоторую логику в своем классе java. Попробуйте использовать ЗАЯВЛЕНИЯ ЕСЛИ, например, htis ==> Если значение равно Dulces de Leche, создайте новую переменную и присвойте ей значение, равное единице ....

Zeusox 26.10.2018 18:10

!!! Почему это не работает ?? <input type = "hidden" th: field = "* {idCategoria}" th: if = "* {category == 'Dulces de Leche'}" th: value = "1" /> Мне действительно нужно сделать это в шаблон листа

Nacho Zve De La Torre 26.10.2018 19:43

Ни это: <div th: field = "* {idCategoria}"> <div th: switch = "* {category}"> <input type = "hidden" th: case = "'Dulces de Leche'" value = " 1 "/> <input type = " hidden "th: case = " 'Cremas' "value = " 2 "/> <input type = " hidden "th: case = " 'Chocolates' "value = " 3 "/> <input type = "hidden" th: case = "'Frutales'" value = "4" /> </div> </div>

Nacho Zve De La Torre 26.10.2018 20:37

Просто используйте java для получения значений и проверьте, равно ли значение - например, Dulces de Leche - инициируйте новую переменную String со значением 1 и так далее ...

Zeusox 26.10.2018 20:48

Это не так просто, потому что я использую Spring! Вот почему я хочу сделать это в шаблоне ... не знаю, где разместить логику для этого в Spring: /

Nacho Zve De La Torre 26.10.2018 21:00

Что у вас есть в вашем Spring Controller?

Zeusox 26.10.2018 21:04

@RequestMapping (value = "gustos / add") public String formNewGusto (Модель модели) {model.addAttribute ("gusto", new Gusto ()); вернуть «форму»; }

Nacho Zve De La Torre 26.10.2018 21:09

Это метод, который возвращает представление для формы

Nacho Zve De La Torre 26.10.2018 21:10
Ответ принят как подходящий

Для этого можно использовать jQuery. Просто создайте новый скрытый ввод с отсутствующим полем. Ваш код будет выглядеть следующим образом.

Сначала изменится ваш новый ввод и выбор категории

<input id = "id" th:field = "*{id}" hidden = "hidden"/>
<select id = "categorias" th:field = "*{categoria}">
    <option value = "" disabled = "disabled">Categoria</option>
    <option value = "Dulces de Leche">Dulce de Leche</option>
    <option value = "Cremas">Cremas</option>
    <option value = "Chocolates">Chocolates</option>
    <option value = "Frutales">Frutales</option>
</select>

Теперь ваш jQuery

$('#categorias').on('change', function() {
    var value = $(this).val();
    if (value === "Dulce de Leche") {
        $('#id').val(1);
    }
    // Now you just fill the rest.
})

Итак, теперь, каждый раз, когда вы меняете категорию, вы будете добавлять новое значение к идентификатору. Надеюсь, это поможет! Если вам еще что-нибудь понадобится, дайте мне знать.

Спасибо Алене !!! Эта логика кажется хорошей, я не знаю, почему я получаю lang.IllegalArgumentException: не удается установить int field com.uces.CopitoDeNieve.model.Gusto.idCategoria в нулевое значение ----> ошибка сообщения

Nacho Zve De La Torre 26.10.2018 22:02

Это потому, что мы устанавливаем для null значение int, которое является примитивом. Вы получаете это после отправки формы или при парсинге? Если вы получаете его при отправке, вы можете добавить th:value=0 во ввод идентификатора. Конечно, потом вам нужно будет проверить, что ваш идентификатор не равен 0.

Alain Cruz 26.10.2018 22:04

Да, я получаю его после отправки ... Сейчас попробую с этим вариантом!

Nacho Zve De La Torre 26.10.2018 22:05

Мое последнее исправление позволит избежать только lang.IllegalArgumentException, но вы по-прежнему не получаете правильного значения. Это означает, что мы не устанавливаем правильное значение в нашем jquery. В своем ответе допустил опечатку, вместо Dulces de Leche написал Дульсе де Лече. Это могло вызвать проблемы.

Alain Cruz 26.10.2018 22:08

По-прежнему null ... даже с добавлением S в Dulces de Leche ... это становится странным :(

Nacho Zve De La Torre 26.10.2018 22:11

Оппс меняет *{id} на *{idCategoria}. Только что понял, что использовал неправильное поле.

Alain Cruz 26.10.2018 22:13

Я изменил его раньше, потому что увидел ошибку, но все равно ноль

Nacho Zve De La Torre 26.10.2018 22:15

<div class = "col s12 l8"> <input id = "id" th: value = "0" th: field = "* {idCategoria}" hidden = "hidden" /> <select id = "categoryorias" th: field = "* {category}"> <option value = "" disabled = "disabled"> Категория </option> <option value = "Dulces de Leche"> Dulce de Leche </option> <option value = "Cremas" > Кремы </option> <option value = "Chocolates"> Шоколадные конфеты </option> <option value = "Frutales"> Frutales </option> </select> </div>

Nacho Zve De La Torre 26.10.2018 22:15

Вы не возражаете добавить свой метод контроллера? Я хочу проверить, как вы делаете привязку.

Alain Cruz 26.10.2018 22:18

Это метод, который обрабатывает представление @RequestMapping (value = "gustos / add") public String formNewGusto (Model model) {model.addAttribute ("gusto", new Gusto ()); вернуть «форму»; }

Nacho Zve De La Torre 26.10.2018 22:23

Хорошо, это тот, который вы используете для загрузки страницы. Я имею в виду ту, куда вы отправляете свой пост. Тот, который сопоставлен с /gustos, должен иметь тип POST.

Alain Cruz 26.10.2018 22:25

Извините :) @RequestMapping (value = "/ gustos", method = RequestMethod.POST) public String addGusto (Gusto gusto) {gustoService.save (gusto); вернуть "redirect: / gustos"}

Nacho Zve De La Torre 26.10.2018 22:27

Самое безумное, что другие поля работают нормально ... они отображаются в БД, как и ожидалось, но не это :(

Nacho Zve De La Torre 26.10.2018 22:28

Что ж, это не должно иметь значения, но давайте посмотрим, работает ли это. Измените его на следующее. @RequestMapping(value = "/gustos", method = RequestMethod.POST) public String addGusto(@ModelAttribute("gusto") Gusto gusto){ gustoService.save(gusto); return "redirect:/gustos" }. Да, это странно, так как вы даже добавляете к нему значение по умолчанию.

Alain Cruz 26.10.2018 22:31

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