2016-07-04 24 views
0

私はThymeleafでSpringBootを使用して、2つのテクノロジーを学ぶのに役立つ簡単な例を作成しています。Thymeleaf with SpringBoot - モデルをループして削除するには?

私は、エンティティは、IDとコンテンツを持って挨拶ですTHIS GUIDE

に私の例を基づかています。

挨拶を作成して、私が作成したすべての挨拶を表示することができます。

次に、リストページの各グリーティングに対して削除オプションを追加するとします。削除をクリックすると、オブジェクトが削除され、リストページが再度表示されます。

ああ、私はリストページをロードするとき、私はこのエラーを取得:

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

コントローラとレポジトリオブジェクト

@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ページ:

<!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> 

ここで正しい方向にプッシュする:-)

答えて

0

私はこの行が間違っていると思います。

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

Thanks Hasitha、これはエラーを回避しましたが、Greetingオブジェクトはコントローラのdeleteメソッドに到着したときにインスタンス化されません。私。私が何をクリックしても、idは常に0です。 また、実際のオブジェクトが既にモデルに入っているときに、モデルに空のオブジェクトを追加する必要があるのは不思議です。私。 'greeting ** s **'オブジェクトはすべての 'greeting'オブジェクトを含むリストです。私は、現在の反復(挨拶)変数を入れ子になった削除フォームで使用できると思いましたか? – MooMoo

0

あなたは、このアプローチを非常に簡単にそれを行うことができますformdeleteにあいさつを使用する必要がいけません。 url内のgreetingidを非表示にします。だからformhidden tagsを使う必要はありません。 のincoming idを受け入れるために、annotatecontroller方法を以下の方法で受け入れる。 formhtmlコードで置き換え、のdeleteメソッドでもreplaceと置き換えてください。

<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"; 
     } 

編集: - あなたは、次の例から与えられたid.checkからオブジェクトを取得するためにfindOneメソッドを使用することができます コントローラ内に存在するオブジェクトを必要とするからです。

+0

ありがとうPriyamal、私は変更しました @RequestMapping(値= "/ {id} /編集"、メソッド= RequestMethod.GET) ' to ' @RequestMapping(value = "/ greeting/{id}/delete")メソッド= RequestMethod.GET) ' と動作します。しかし、私は実際にそのようなシナリオでメソッドにオブジェクトを渡す方法を示すボタンと例の後でした。私の次のステップはオブジェクトの編集を行うことでした。それでなぜこれに興味がありますか? – MooMoo

+0

'

'の出力をビューに表示します。それは '0'ですか? – Priyamal

+0

私の例では(実行するように 'フォーム'をコメントアウトした場合)、出力は次のようになります: 'id:6' – MooMoo

関連する問題