2016-07-04 5 views
0

Я использую SpringBoot с Thymeleaf, чтобы создать тривиальный пример, который поможет мне изучить две технологии.Thymeleaf with SpringBoot - как скомпилировать модель и удалить?

Я основывая свой пример на THIS GUIDE

объекта является приветствием, которое имеет идентификатор и содержание.

Я создаю приветствие просто отлично, и я могу перечислить все приветствия, которые я создал.

Затем я хотел добавить опцию удаления для каждого приветствия на странице списка. Когда вы нажимаете delete, я хочу, чтобы объект был удален, и страница списка снова отлаживалась.

Увы, когда я загружаю страницу списка я получаю эту ошибку:

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

контроллер и respository объекты

@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

Спасибо Hasitha, это прошло мимо ошибки, однако объект Greeting не создается, когда он прибывает в метод удаления контроллера. То есть id всегда 0, несмотря на то, что я нажимаю. Кроме того, мне любопытно, почему мне нужно добавить пустой объект к модели, когда реальный объект уже находится в модели? То есть объект приветствия ** s ** - это список, содержащий все объекты «приветствия». Я думал, что смогу использовать текущую переменную итерации (приветствия) во вложенной форме удаления? – MooMoo

0

вы не должны использовать form для delete приветствие вы можете сделать это очень легко с этим подходом. скрыть idgreeting в пределах url. поэтому вам не нужно использовать form и hidden tags. и annotate метод controller со следующим подходом, принять incoming id от greeting. заменить ток form с данными html и replacedelete метод в controller.

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

редактировать: - так как вам нужно объект присутствовать в контроллере вы можете использовать метод findOne для извлечения объекта из заданного id.check из следующего примера.

<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

Спасибо Priyamal, я изменил '@RequestMapping (value ="/{id}/edit ", method = RequestMethod.GET)' to '@RequestMapping (value ="/greeting/{id}/delete ", method = RequestMethod.GET) ' и он работает. Тем не менее, я был действительно после кнопки и примера, показывающего, как передать объект в метод в таком сценарии. Следующим шагом было сделать редактирование объекта, поэтому я заинтересован в этом. – MooMoo

+0

Каков вывод '' этой строки в представлении. это '0'?. – Priyamal

+0

В моем примере (если я прокомментирую «форму» так, чтобы она выполнялась), выход будет выглядеть так: 'id: 6' – MooMoo

Смежные вопросы