Выберите тег с объектом-Thymeleaf и Spring MVC
Я пытаюсь изменить код этого примера thymeleafexamples-stsm, поэтому я изменил тип перечисления для типа класса:
тип.java
public class Type {
private Integer id;
private String type;
...getters and setters
}
SeedStarterMngController.java
@ModelAttribute("allTypes")
public List<Type> populateTypes() {
Type type1 = new Type();
type1.setId(1);
type1.setType("OUTDOOR");
Type type2 = new Type();
type2.setId(2);
type2.setType("INDOOR");
List<Type> tipos = new ArrayList<Type>();
tipos.add(type1);
tipos.add(type2);
return tipos;
}
seedstartermng.HTML-код
<select th:field="*{type}">
<option th:each="type : ${allTypes}" th:value="${type}" th:text="${type.type}">Wireframe</option>
</select>
Итак, я не могу добавить стартер семян.
мой выходной html
<select id="type" name="type">
<option value="thymeleafexamples.stsm.business.entities.Type@2c08cec0">OUTDOOR</option>
<option value="thymeleafexamples.stsm.business.entities.Type@26cf024">INDOOR</option>
</select>
и ошибка
не удалось преобразовать значение свойства типа Java.ленг.Строку требуемый введите thymeleafexamples.stsm.бизнес.сущности.Тип тип свойства ; вложенные исключением является Java.ленг.IllegalStateException: не удается преобразовать значение типа [java.ленг.Строка] для требуемого типа [thymeleafexamples.stsm.бизнес.сущности.Тип] для типа свойства: нет соответствующие редакторы или стратегия преобразования найдены
как я могу сделать, чтобы быть сопоставлены с типом правильно? Надеюсь, вы сможете мне помочь. Спасибо.
2 ответов
это сообщение об ошибке в основном говорит, что весна не знает, как преобразовать строку thymeleafexamples.stsm.business.entities.Type@2c08cec0
в экземпляр типа. Это ошибка в коде, потому что нет никакого смысла пытаться сделать это.
вы не должны использовать toString()
значение объекта в качестве выпадающего идентификатора формы. Вам нужно иметь (гораздо) лучшую стратегию для кода, чтобы определить тип, выбранный пользователем.
общий подход заключается в использовании :
<option th:each="type : ${allTypes}" th:value="${type.id}" th:text="${type.type}">Wireframe</option>
когда форма отправлена, то вам нужно retireve экземпляр типа на основе его ID имя на геймпаде
Я знаю, этот вопрос старый, но ниже Ответ может помочь кому-то, как я не мог легко найти его.
чтобы решить эту проблему, Thymeleaf использует Форматеры, чтобы конвертировать между Object и String.
- в фазе отображения (GET) служба форматирования преобразует объект в Строка.
-
на этапе отправки (POST) служба форматирования преобразует строку назад в
"объект".
первая реализация форматирования сервис для вашего класса, который будет использоваться в теге:
@Service
public class TypeFormatter implements Formatter<Type> {
@Autowired
TypeService typeService;//Service -> DB
@Override
public String print(Type object, Locale locale) {
return (object != null ? object.getId().toString() : "");
}
@Override
public Type parse(String text, Locale locale) throws ParseException {
Integer id = Integer.valueOf(text);
return this.typeService.get(id);//return Type object form DB
}
}
Это очень простой класс с двумя методами:
- печати: преобразует объект в строку.
- парсить: преобразует строку в объект.
Теперь мы должны рассказать Spring-Thymeleaf ABB о нашем форматере или мы можем назвать его конвертером. Для этого мы должны зарегистрировать этот форматтер в нашем WebConfig (конфигурационный класс, который расширяет WebMvcConfigurerAdapter):
@Configuration
@EnableWebMvc
@ComponentScan(value = { "your package" })
public class WebConfig extends WebMvcConfigurerAdapter {
....
//Formatters
@Autowired //Without autowire, this solution may not work
private TypeFormatter typeFormatter;
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addFormatter(typeFormatter);
}
}
Теперь наше решение готово к реализации в html-файле, но как сказать Thymeleaf применить преобразование? Ответ: с помощью th: field=" * {type}" атрибут и использование синтаксиса двойной скобки th: value= " ${{type}}":
<select th:field="*{type}">
<option th:value="NULL" th:text="---Select Type---"></option>
<option th:each="type : ${allTypes}" th:value="${{type}}" th:text="${type.type}">Wireframe</option>
</select>
- th: field=" * {type}" по умолчанию применяется зарегистрированный сервис форматирования. Он преобразует type в String (здесь строка будет Type Id)
- th: value= " ${{type}}" также преобразует тип в строку.
- в submit Spring будет использовать службу форматирования для преобразования Id обратно возражать.
последнее, что нужно сказать, иногда мы хотим добавить заголовок в раскрывающийся список, например " - - - - - выберите тип - - - - -", чтобы предотвратить выбор по умолчанию, а также объяснить пользователю. В этом случае необходимо установить th: value= "NULL" если вы не получите ошибку преобразования.