Выберите тег с объектом-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" если вы не получите ошибку преобразования.