Привязка списка в Thymeleaf

#html #spring #spring-boot #spring-mvc #thymeleaf

#HTML #весна #весенняя загрузка #spring-mvc #thymeleaf

Вопрос:

У меня есть объект модели с этим свойством:

 private List<MultipartFile> files;
 

но когда я привязываю их к шаблону:

 <input type="file" id="file1" class="form-control" th:field="*{files[0]}" name="files" accept=".gif, .jpg, .png, .jpeg" />
<input type="file" id="file2" class="form-control" th:field="*{files[1]}" name="files" accept=".gif, .jpg, .png, .jpeg" />
 

У меня такая ошибка:

     ... 85 common frames omitted
Caused by: org.springframework.beans.NullValueInNestedPathException: Invalid property 'files' of bean class [com.domain.frontend.UserPayload]: Could not instantiate property type [org.springframework.web.multipart.MultipartFile] to auto-grow nested property path; nested exception is java.lang.NoSuchMethodException: org.springframework.web.multipart.MultipartFile.<init>()
    at org.springframework.beans.AbstractNestablePropertyAccessor.newValue(AbstractNestablePropertyAccessor.java:919)
    at org.springframework.beans.AbstractNestablePropertyAccessor.growCollectionIfNecessary(AbstractNestablePropertyAccessor.java:785)
    at org.springframework.beans.AbstractNestablePropertyAccessor.getPropertyValue(AbstractNestablePropertyAccessor.java:654)
    ... 96 common frames omitted
Caused by: java.lang.NoSuchMethodException: org.springframework.web.multipart.MultipartFile.<init>()
 

Ответ №1:

У меня была похожая проблема не так давно. Я решил это, обернув объект List<> в объект передачи данных, а затем изменив список <> как поле вместо самого объекта. Вот ваше решение: класс DTO

 public class FileDTO {

    private List<File> files;

    public FileDTO() {
        files = new ArrayList<>();
    }

    public List<File> getFiles() {
        return files;
    }

    public void setFiles(List<File> files) {
        this.files = files;
    }
}
 

просмотр thymeleaf:

 <form action="/example" th:object="${dto}">
    <input type="file" th:each="file, itemStat : *{files}" th:id="${'file'   ${itemStat.index}}"
           th:field="*{files[__${itemStat.index}__]}" name="files" accept=".gif, .jpg, .png, .jpeg">
    <input type="submit" value="Submit">
</form>
 

Извините, если это было слишком сложно для сортировки. Но идея в том, что это List<> должно быть поле, а не сам объект, поддерживающий форму, тогда для итерации по полю List<> вы можете использовать показанный цикл.