Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ. (επεξεργασμένο)

Καλησπέρα,

Προσπαθώ να φτιάξω μία εφαρμογή σε 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.

Κάποια βοήθεια; Έστω και με λινκ.

Επεξ/σία από Lanike71
Δημοσ. (επεξεργασμένο)

με παρα πολύ γρήγορη ματια και χωρις να εχω δει ποτε thymeleaf, 
 

    <div>
        <label>Book title:</label>
        <input type="text" field="*{}" placeholder="Enter title" required />
    </div>

Στο  field="*{}"  δεν θα έπρεπε να έχεις το όνομα που κάνει bind τη μεταβλητή στο BE σου; πχ field="*{title}"

Επεξ/σία από filip123go
Δημοσ. (επεξεργασμένο)
13 λεπτά πριν, filip123go είπε

με παρα πολύ γρήγορη ματια και χωρις να εχω δει ποτε thymeleaf, 
 

    <div>
        <label>Book title:</label>
        <input type="text" field="*{}" placeholder="Enter title" required />
    </div>

Στο  field="*{}"  δεν θα έπρεπε να έχεις το όνομα που κάνει bind τη μεταβλητή στο BE σου; πχ field="*{title}"

Ήταν τυπογραφικό λάθος (μόνο εδώ).

Αλλά δεν είναι αυτό, δυστυχώς.

Επεξ/σία από Lanike71
Δημοσ.

Στα fields στην HTML βάλε th:field όχι σκέτο field, για να τα κάνεις bind με τα attributes του model.

Επίσης στο action έχεις ένα {id} στο uri ,δεν θα έπρεπε να είναι author.id;

Δημοσ.
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";
    }
}

 

  • 2 εβδομάδες αργότερα...

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...