2016-07-04 7 views
0

Ich verwende SpringBoot mit Thymeleaf, um ein triviales Beispiel zu erstellen, das mir hilft, die beiden Technologien zu lernen.Thymoleaf mit SpringBoot - wie man das Modell schleift und löscht?

ich mein Beispiel auf THIS GUIDE

Das Unternehmen am stützen ist ein Gruß, die eine Identifikation und einen Inhalt hat.

Ich erstelle den Gruß ganz gut, und ich kann alle Grüße auflisten, die ich erstellt habe.

Ich wollte dann eine Löschoption für jede Gruß auf der Listenseite hinzufügen. Wenn ich auf Löschen klicke, möchte ich, dass das Objekt gelöscht und die Listenseite erneut angezeigt wird.

Ach, wenn ich die Liste Seite laden bekomme ich diesen Fehler:

java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'greeting' available as request attribute

-Controller und respository Objekte

@Controller 
public class GreetingController { 

    @Autowired 
    GreetingRepo gr; 

    @RequestMapping(value="/greeting/list", method=RequestMethod.GET) 
    public String greetingsForm(Model model) { 
     model.addAttribute("greetings", gr.findAll()); 
     return "greeting/list"; 
    } 

    @RequestMapping(value="/greeting/delete", method=RequestMethod.POST) 
    public String deleteGreeting(@ModelAttribute("greeting") Greeting greeting) { 
     gr.delete(greeting); 
     return "redirect:/greeting/list"; 
    } 


} 

@RepositoryRestResource 
interface GreetingRepo extends JpaRepository<Greeting, Long> { 

} 

list.html Seite:

<!DOCTYPE HTML> 
<html xmlns:th="http://www.thymeleaf.org"> 
<head> 
    <title>Getting Started: Handling Form Submission</title> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
</head> 
<body> 
    <h1>Result</h1> 
    <div th:each="greeting : ${greetings}"> 
     <p th:text="'id: ' + ${greeting.id}" /> 
     <p th:text="'content: ' + ${greeting.content}" /> 
     <form action="#" th:action="@{/greeting/delete}" th:object="${greeting}" method="post"> 
      <input type="hidden" th:field="*{id}"/> 
      <input type="hidden" th:field="*{content}"/> 
      <input type="Submit" value="Delete"/> 
     </form> 
    </div> 
    <a href="/greeting/add">Add another</a> 
    <a href="/greeting/list">Show All</a> 
</body> 
</html> 

Würde appre ziehe einen Schub in die richtige Richtung :-)

Antwort

0

Ich glaube, du vermisst diese Linie.

model.addAttribute("greeting", new Greeting()); 

@RequestMapping(value="/greeting/list", method=RequestMethod.GET) 
public String greetingsForm(Model model) { 
    model.addAttribute("greeting", new Greeting()); 
    model.addAttribute("greetings", gr.findAll()); 
    return "greeting/list"; 
} 
+0

Dank Hasitha, dies ging über den Fehler, aber das Grußobjekt wird nicht instanziiert, wenn es in der Löschmethode des Controllers ankommt. I.e. Die ID ist immer 0 trotz was ich anklicke. Ich bin auch neugierig, warum ich ein leeres Objekt zum Modell hinzufügen müsste, wenn das reale Objekt bereits im Modell ist? I.e. das 'gruß ** s **' Objekt ist eine Liste, die alle 'gruß' Objekte enthält. Ich dachte, ich wäre in der Lage, die aktuelle Iteration (Begrüßung) Variable in der verschachtelten Löschform zu verwenden? – MooMoo

0

Sie nicht eine form-delete den Gruß verwenden müssen Sie es sehr leicht mit diesem Ansatz zu tun. verstecken Sie die id der greeting innerhalb der url. Sie müssen also keine form und hidden tags verwenden. und annotate die controller Methode mit folgendem Ansatz, incoming id der greeting zu akzeptieren. ersetzen Sie die aktuelle form mit gegebenen html Code und replace die delete Methode in der controller als auch.

<a th:href="@{/greeting/{id}/delete(id=${greeting.id})}" th:text="delete"></a> 

     @RequestMapping(value="/greeting/{id}/delete",method=RequestMethod.GET) 
     public String deleteGreeting(@PathVariable int id) { 
      gr.delete(id); 
      return "redirect:/greeting/list"; 
     } 

edit: - da Sie das Objekt müssen innerhalb des Controllers sein Sie FindOne Methode verwenden, können Sie das Objekt aus dem angegebenen id.check aus dem folgenden Beispiel zu holen.

<a th:href="@{/greeting/{id}/edit(id=${greeting.id})}" th:text="edit"></a> 

    @RequestMapping(value="/greeting/{id}/edit",method=RequestMethod.GET) 
    public String Edit(@PathVariable int id){ 
    greeting greetingob = gr.findOne(id); 
    return "edit"; 
    } 
+0

Danke Priyamal, ich änderte '@RequestMapping (Wert ="/{id}/edit ", Methode = RequestMethod.GET)' zu '@RequestMapping (Wert ="/Gruß/{ID}/löschen ", Methode = RequestMethod.GET) ' und es funktioniert. Allerdings habe ich wirklich nach einer Schaltfläche und einem Beispiel gesucht, wie in einem solchen Szenario das Objekt in die Methode übergeben wird. Mein nächster Schritt war die Bearbeitung des Objekts, weshalb ich mich dafür interessiere. – MooMoo

+0

was ist die Ausgabe von '

' diese Zeile in der Ansicht. ist es "0"? – Priyamal

+0

In meinem Beispiel, (wenn ich das 'Formular' auskommentieren, so dass es ausgeführt wird), würde die Ausgabe wie sein: 'id: 6' – MooMoo