2016-04-17 2 views
0

Я стараюсь сделать мини-форум, и я застрял. Как это должно быть, прежде всего, вы создаете сообщение и пишете сообщение о теме, оно перенаправляет на все сообщения и добавляет новые опубликованные, которые вы создали, пользователь нажимает на сообщение, и на следующей странице отображается все заполненное сообщение. Также я сделал комментарий системы, я каждый пост должен иметь комментарии, поэтому проблема заключается в моем коде, который ниже, когда я пытался заставить эти комментарии работать, он работает следующим образом: не имеет значения, какой идентификатор сообщения вы выбираете, он показывает все комментарии, которые существуют, поэтому я изменился и провалился. Может кто-то объяснит мне, как правильно исправить спящий режим.Весенний ботинок + контроллер гибернатора

PostController: обратите внимание на метод seeMessage, он находит сообщение по id и показ сообщения.

package com.pandora.controllers; 


import com.pandora.domain.Post; 
import com.pandora.services.CommentService; 
import com.pandora.services.PostService; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Controller; 
import org.springframework.ui.Model; 
import org.springframework.web.bind.annotation.ModelAttribute; 
import org.springframework.web.bind.annotation.PathVariable; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 


@Controller 
@RequestMapping("/posts") 
public class PostController { 

    @Autowired 
    private PostService postService; 

    @Autowired 
    private CommentService commentService; 

    @RequestMapping 
    public String findAll(Model model) { 
     model.addAttribute("posts", postService.findAll()); 
     return "post/post"; 
    } 

    @RequestMapping(value = "/click", method = RequestMethod.GET) 
    public String click() { 
     return "post/new"; 
    } 

    @RequestMapping(value = "/add", method = RequestMethod.POST) 
    public String addPost(@ModelAttribute Post post) { 
     postService.addPost(post); 
     return "redirect:/posts"; 
    } 

    @RequestMapping(value = "/{title}/find", method = RequestMethod.GET) 
    public String findByName(@PathVariable String title) { 
     postService.findByTitle(title); 
     return "redirect:/posts"; 
    } 

    @RequestMapping(value = "/{id}/see", method = RequestMethod.GET) 
    public String seeMessage(@PathVariable long id, Model model) { 
     Post post = postService.findById(id); 
     System.out.println("the id is " + id); 
     System.out.println("the value of comments are " +post.getComments().size()); 

     model.addAttribute("post", post); 
//  model.addAttribute("postMessage", post.getComments()); 

     return "post/postmessage"; 

    } 

    @RequestMapping(value = "/{id}/delete") 
    public String delete(@PathVariable long id) { 
     postService.delete(id); 
     return "redirect:/posts"; 
    } 

    @RequestMapping(value = "/login", method = RequestMethod.GET) 
    public String login(){ 
     return "login"; 
    } 

} 

CommentController: И здесь обратить внимание на метод AddComment, первый я нахожу от того, что идентификатор разместить его пошел и после этого я должен добавить комментарий к основанной сообщению.

package com.pandora.controllers; 

import com.pandora.domain.Comment; 

import com.pandora.domain.Post; 
import com.pandora.services.CommentService; 
import com.pandora.services.PostService; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.ModelAttribute; 
import org.springframework.web.bind.annotation.PathVariable; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 

import java.util.ArrayList; 
import java.util.List; 

@Controller 
@RequestMapping("/comments") 
public class CommentController { 

    @Autowired 
    private CommentService commentService; 

    @Autowired 
    private PostService postService; 

    @RequestMapping(value = "/post/{postId}/comment", method = RequestMethod.POST) 
    public String addComment(@PathVariable long postId, @ModelAttribute Comment comment){ 

     Post post = postService.findById(postId); 

     System.out.println(post.getId()); 
     System.out.println(comment.getMessage()); 

     List comments = new ArrayList(); 

     comments.add(commentService.addComment(comment)); 

     post.setComments(comments); 

     return "redirect:/posts"; 
    } 

    @RequestMapping(value = "/{id}/delete", method = RequestMethod.GET) 
    public String delete(@PathVariable long id){ 
     commentService.delete(id); 
     return "redirect:/posts"; 
    } 

} 

Сообщение юридического лица:

package com.pandora.domain; 

import lombok.Getter; 
import lombok.NoArgsConstructor; 
import lombok.Setter; 

import javax.persistence.*; 
import java.util.List; 

@Entity 
@Setter 
@Getter 
@NoArgsConstructor 
public class Post { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private long id; 

    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "post") 
    private List comments; 

    @Column(length = 10000) 
    private String message; 

    private String title; 
} 

PostService является:

package com.pandora.services; 

import com.pandora.domain.Post; 
import com.pandora.domain.repositories.PostRepository; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Service; 

import java.util.List; 

@Service 
public class PostService { 

    @Autowired 
    private PostRepository postRepository; 

    public Post addPost(Post post){ 
     return postRepository.saveAndFlush(post); 
    } 

    public List findAll(){ 
     return postRepository.findAll(); 
    } 

    public Post findByTitle(String title){ 
     return postRepository.findByTitle(title); 
    } 

    public Post findById(long id){ 
     return postRepository.findOne(id); 
    } 

    public void delete(long id){ 
     postRepository.delete(id); 
    } 

} 

Комментария юридического лица:

package com.pandora.domain; 

import lombok.Getter; 
import lombok.NoArgsConstructor; 
import lombok.Setter; 

import javax.persistence.*; 

@Entity 
@Setter 
@Getter 
@NoArgsConstructor 
public class Comment { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private long id; 

    @ManyToOne(fetch = FetchType.EAGER) 
    private Post post; 

    private String message; 

} 

и CommentService является:

package com.pandora.services; 

import com.pandora.domain.Comment; 
import com.pandora.domain.repositories.CommentRepository; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Service; 

import java.util.List; 

@Service 
public class CommentService { 

    @Autowired 
    private CommentRepository commentRepository; 

    public Comment addComment(Comment comment){ 
     return commentRepository.saveAndFlush(comment); 
    } 

    public List findAll(){ 
     return commentRepository.findAll(); 
    } 

    public void delete(long id){ 
     commentRepository.delete(id); 
    } 

    public Comment findOne(long id){ 
     return commentRepository.findOne(id); 
    } 

} 

и html, который показывает сообщение, которое выбирает по id: здесь обратите внимание на th: каждый контейнер div. Я извлекаю из списка, который ушел из комментариев PostController. Но это не работает, потому что, когда я это делаю, он всегда пуст. Я не знаю, почему это пусто.

<!DOCTYPE html> 
 
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" 
 
     layout:decorator="layout"> 
 

 
<div layout:fragment="content"> 
 

 
    <h2 align="center"> 
 
     <h2 align="left"> 
 
      <div th:text="${post.title}"></div> 
 
     </h2> 
 
    </h2> 
 

 
    <h4 align="center"> 
 
     <div th:text="${post.message}"></div> 
 
    </h4> 
 
    <hr/> 
 
    <h4>Comments:</h4> 
 
    <br/> 
 

 
    <h4> 
 
     <div th:each="comments : ${post}"> 
 
      
 
      <label for="username"><div th:inline="text">[[${#httpServletRequest.remoteUser}]]: </div> </label> 
 
      <div th:each="comment : ${comments.comments}"> 
 
       <div id="username" th:text="${comment}"></div> 
 
      </div> 
 
     </div> 
 
    </h4> 
 

 
    <br/> 
 
    <form method="post" name="comment_form" id="comment_form" th:action="@{'/comments/post/{id}/comment'(id=${post.id}) }" role="form"> 
 
     <div class="form-group"> 
 
      <label for="message">Comment</label> 
 
      <textarea rows="5" class="form-control" id="message" name="message"/> 
 
     </div> 
 
     <button type="submit" id="submit" class="btn btn-primary">Submit</button> 
 
    </form> 
 

 
</div> 
 

 
</html>

ответ

1

На основании вашего сценария это то, что я понимаю: у вас есть пост и некоторые замечания, связанные с ним. Однако, когда вы пытаетесь получить комментарии к определенному сообщению, вы видите все комментарии (также из других сообщений).

Предполагая, что выше, я предлагаю вам не рассматривать комментарии как отдельный объект, потому что комментарии будут присутствовать только в том случае, если есть сообщение, и комментарии должны быть связаны с одним сообщением. @Embeddable может помочь в этом.

Моя рекомендация будет попробовать что-то вроде этого:

Комментируйте, как встраиваемый:

@Embeddable 
public class Comment { 
    private String message; 
    ... 
    ... 
    //Any other properties you might need to add 
} 

И в пост Сущности, сделайте следующие изменения:

@Entity 
@Setter 
@Getter 
@NoArgsConstructor 
public class Post { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private long id; 

    @ElementCollection(fetch=FetchType.EAGER) 
    private List<Comment> comments = new ArrayList<>(); 

    @Column(length = 10000) 
    private String message; 

    private String title; 
} 

После этого , вы можете потерять CommentService и CommentRepository, поскольку они больше не понадобятся. Позвольте мне знать, если это помогает.

+0

но как он будет работать? Если я вложил в комментарий, в любом случае мне нужно найти сообщение по id и показать все комментарии, сохраненные в сообщении. Есть способ, как исправить, даже таким образом, как я это сделал, но я просто не могу понять точно, пожалуйста, посмотрите на метод CommentController «addComment», поэтому вы обнаружите, что когда я нажимаю на ссылку html, он переходит к этому контроллеру и добавляет комментарий, но Вопрос в том, как точно сохранить точно контроллер? Вот почему я сначала нахожусь в сообщении Id, и я должен добавить комментарий именно в этот идентификатор сообщения. – Dave

+0

и когда я получаю все эти комментарии в PostController в методе "seeMessage" – Dave

1

Необходимо также изменить контроллер. Подумайте о чем-то подобном, у вас есть сообщение с нулевыми комментариями.Затем пользователь отправляет комментарий по методу PostController сказать:

@RequestMapping(value = "/post/{postId}/addComment", method = RequestMethod.POST) 
      public String addPost(@PathVariable("postId")long id, @ModelAttribute Comment comment) { 
       postService.addComment(id, comment); 
       return "redirect:/to_whatever"; 
      } 

И в вашем PostService вы можете добавить ниже функцию:

public Post addComment(long id, Comment comment){ 
     Post post = postRepository.findOne(id); 
     post.getComments().add(comment); 
     return postRepository.saveAndFlush(post); 
    } 

Изменение интерфейса после вызова соответственно. Кроме того, это также позволит получить часть поиска. Скажем, вы хотите получать комментарии к сообщению, все, что вам нужно сделать, это найти сообщение по id (или любому другому уникальному идентификатору) и выполнить post.getComments();

Встраиваемые устанавливают отношение OneToMany между почтой и комментарием. См. this for more details.

На уровне базы данных, вы будете иметь что-то вроде этого:

POST TABLE 
post_id  post_name 
    1   A 
    2   B 



POST_COMMENTS TABLE 
post_id  message 
    1   C 
    1   D 
    2   E 
    2   F 

Надеется, что это очищает вопрос.