Шаблон Thymeleaf и Spring Boot: создание радиовхода из перечисления Java - PullRequest
0 голосов
/ 02 ноября 2018

Я бы хотел заполнить элемент управления радиовходом в Thymeleaf автоматически из типа перечисления Java, называемого «источник». Я использую Spring Boot в бэкэнде. Мой контроллер инициализирует список значений перечисления следующим образом:

this.sourcesAsList = Arrays.asList(Source.values());
model.addAttribute("sources", sourcesAsList);

Это прекрасно работает, по крайней мере, в том, что касается List (как я вижу в выходных данных журнала).

Затем шаблон Thymeleaf пытается создать экземпляр радиоуправления на основе этого атрибута в модели, например:

<div th:each="source : ${sources}">
  <input type="radio" th:field="*{source}"  th:value="${source.value}"/><label th:text="| ${source.value} |">Should not see this !</label>
</div>

Однако, когда я пытаюсь загрузить эту страницу, я получаю следующую ошибку:

[Request processing failed; nested exception is org.thymeleaf.exceptions.TemplateInputException: An error happened during template parsing (template: "class path resource [templates/feedbackapp2.html]")] with root cause

java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'source' available as request attribute

Перечисление довольно простое:

public enum Source {
    VALONE, VALTWO, VALTHREE, VALFOUR;

    public String getName() {
        return this.name();
    }
}

Это первый раз, когда я работаю с Thymeleaf, так что я предполагаю, что это где-то просто проблема синтаксиса, но даже после поиска в Google я не смог найти работающий пример. Есть идеи? Можно ли вообще сделать это с помощью enum? Если нет, какой тип данных будет более подходящим?

Большое спасибо. Ура

Martin

1 Ответ

0 голосов
/ 03 ноября 2018

Я немного поиграл, и все заработало. Следующий фрагмент HTML-кода отображает переключатели правильно на основе списка Enums, а также правильно подключен к модели, так как я получил выбранное значение в методе POST контроллера:

<div th:each="source : ${sources}">
  <input name="source" type="radio" th:value="${source}"/><label for="source" th:text="| &nbsp; ${source} |">Something is wrong !</label>
</div>

Было две проблемы:

  • нет необходимости обращаться к атрибуту name () перечисления (так что можно использовать $ {source} вместо $ {source.name})
  • вместо th: field, используйте атрибут namne элемента управления вводом

Большое спасибо Периклису за комментарий.

...