Lanike71 Δημοσ. 20 Οκτωβρίου 2024 Δημοσ. 20 Οκτωβρίου 2024 (επεξεργασμένο) Καλησπέρα, Προσπαθώ να φτιάξω μία εφαρμογή σε spring boot. Είναι η κλασική εφαρμογή library management, με βιβλία, συγγραφείς κλπ. Δύο entities, Author και Book, έφτιαξα controllers, services, repositories κλπ. Ως τώρα έχω καταφέρει να μπορώ να αποθηκεύω authors. Θέλω να κάνω το εξής: Στον κλασικό πίνακα των authors, μπαίνουν buttons για edit, delete. Θέλω να βάλω ένα button "New book", ώστε με το πάτημα να εμφανίζεται ένα html όπου θα αποθηκεύεται το βιβλίο για τον συγκεκριμένο author. Οι μέθοδοι στον controller: @GetMapping("add-book-for-author/{id}") public String addBookForAuthor(@PathVariable("id") Long id, Model model) { Author author = authorService.getAuthorById(id); Book book = new Book(); model.addAttribute("author", author); model.addAttribute(("book"), book); return "add-books"; // } @PostMapping("/authors/{id}/books") public String addTest(Book book, @PathVariable("id") Long id) { Author author = authorService.getAuthorById(id); book.setAuthor(author); bookService.saveBook(book); return "redirect:authors"; // Redirect to the author details page } και η html <!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <title>Add New Book</title> </head> <body> <h2>Add New Book for Author: <span th:text="${author.lastName}"></span></h2> <form th:action="@{/authors/{id}/books(id=${author.id})}" th:object="book" method="POST"> <div> <label>Book title:</label> <input type="text" field="*{title}" placeholder="Enter title" required /> </div> <div> <label>Book isbn</label> <input type="text" field="*{isbn}" placeholder="Enter isbn" required /> </div> <div> <label>Book category</label> <input type="text" field="*{category}" required /> </div> <div> <button type="submit">Add book</button> </div> </form> </body> </html> Στο τέλος μου πετάει σφάλμα ότι είναι null ο τίτλος του βιβλίου, γιατί στο entity το έχω επισημάνει ως nullable = false. Κάποια βοήθεια; Έστω και με λινκ. Επεξ/σία 20 Οκτωβρίου 2024 από Lanike71
filip123go Δημοσ. 20 Οκτωβρίου 2024 Δημοσ. 20 Οκτωβρίου 2024 (επεξεργασμένο) με παρα πολύ γρήγορη ματια και χωρις να εχω δει ποτε thymeleaf, <div> <label>Book title:</label> <input type="text" field="*{}" placeholder="Enter title" required /> </div> Στο field="*{}" δεν θα έπρεπε να έχεις το όνομα που κάνει bind τη μεταβλητή στο BE σου; πχ field="*{title}" Επεξ/σία 20 Οκτωβρίου 2024 από filip123go
Lanike71 Δημοσ. 20 Οκτωβρίου 2024 Μέλος Δημοσ. 20 Οκτωβρίου 2024 (επεξεργασμένο) 13 λεπτά πριν, filip123go είπε με παρα πολύ γρήγορη ματια και χωρις να εχω δει ποτε thymeleaf, <div> <label>Book title:</label> <input type="text" field="*{}" placeholder="Enter title" required /> </div> Στο field="*{}" δεν θα έπρεπε να έχεις το όνομα που κάνει bind τη μεταβλητή στο BE σου; πχ field="*{title}" Ήταν τυπογραφικό λάθος (μόνο εδώ). Αλλά δεν είναι αυτό, δυστυχώς. Επεξ/σία 20 Οκτωβρίου 2024 από Lanike71
papp0us Δημοσ. 20 Οκτωβρίου 2024 Δημοσ. 20 Οκτωβρίου 2024 Στα fields στην HTML βάλε th:field όχι σκέτο field, για να τα κάνεις bind με τα attributes του model. Επίσης στο action έχεις ένα {id} στο uri ,δεν θα έπρεπε να είναι author.id;
Lanike71 Δημοσ. 21 Οκτωβρίου 2024 Μέλος Δημοσ. 21 Οκτωβρίου 2024 13 ώρες πριν, papp0us είπε Στα fields στην HTML βάλε th:field όχι σκέτο field, για να τα κάνεις bind με τα attributes του model. Επίσης στο action έχεις ένα {id} στο uri ,δεν θα έπρεπε να είναι author.id; Σε αυτό που λες έχεις δίκιο, ήθελε "th:field" για να δουλέψει. Το κύριο πρόβλημα ήταν στο όρισμα που παίρνει το model και οι μέθοδοι. Με την πρώτη μέθοδο στέλνω ένα κενό Book και ένα συγκεκριμένο Author στην thymeleaf και με τη δεύτερη παίρνω το δημιουργημένο Book μέσω της Post. Αν τα λέω καλά, δεν έχω καιρό που μαθαίνω. @GetMapping("add-book-for-author/{id}") public String addBookForAuthor(@PathVariable("id") Long id, Model model) { Author author = authorService.getAuthorById(id); model.addAttribute("myAuthor", author); Book book = new Book(); model.addAttribute(("myBook"), book); return "add-books"; } @PostMapping("/authors/{id}/books") public String addBook(@ModelAttribute Book book, Model model, @PathVariable("id") Long id) { model.addAttribute("myBook", book); Author author = authorService.getAuthorById(id); book.setAuthor(author); bookService.saveBook(book); return "redirect:/authors"; } }
GeG Δημοσ. 30 Οκτωβρίου 2024 Δημοσ. 30 Οκτωβρίου 2024 Επειδή λίγο έχω ασχοληθεί με spring, το thymleaf τι είναι στο περιπου ;
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα