Problema simple pero no puedo encontrar una solución: tengo un formulario Thymeleaf que se usa para agregar un nuevo objeto, por ejemplo, de una clase de libro. Funciona perfectamente bien y solo necesito ese formulario en particular para agregar nuevos objetos, no editar los existentes. La pregunta es: ¿cómo puedo poner varios objetos de la clase Libro en la misma forma única? Entonces, simplemente por conveniencia, en lugar de completar el formulario para un solo libro y hacer clic en Enviar, puede completar el formulario para varios libros a la vez y solo luego hacer clic en Enviar, insertarlos todos en la base de datos (en cualquier orden) y también tener la opción de llene el formulario parcialmente (por ejemplo, el formulario tiene espacio para 5 libros pero también aceptará 1, 2, 3 o 4 y puede dejar el resto en blanco).

Editar: he intentado pasar una lista de objetos a la plantilla Thymeleaf con el formulario vinculado a toda la lista y la iteración dentro, pero Thymeleaf arroja BingingResultError al renderizarlo.

0
PaulJK 28 ago. 2020 a las 14:37

1 respuesta

La mejor respuesta

Necesita usar un objeto contenedor para darse cuenta de lo que quiere. Algo como:

public class BooksCreationDto {
    private List<Book> books;
 
    // default and parameterized constructor
 
    public void addBook(Book book) {
        this.books.add(book);
    }
    
    // getter and setter
}

Entonces necesitas pasar este objeto como un atributo de modelo en tu controlador:

BooksCreationDto booksForm = new BooksCreationDto();
model.addAttribute("form", booksForm);

Enlazar campos usando la propiedad de índice

   th:field="*{books[__${itemStat.index}__].title}"

Y recupera el resultado con

 @ModelAttribute BooksCreationDto form 

En tu controlador.

Para obtener una explicación completa y detallada, visite: https://www.baeldung.com/thymeleaf-list

1
Xtof 28 ago. 2020 a las 22:05