#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<> вы можете использовать показанный цикл.