具有MongoDB POST和GET记录的Spring控制器

时间:2016-04-18 10:47:03

标签: java spring mongodb model-view-controller

当我想在我的数据库中发布内容并检索它时,我需要帮助了解我应该如何以及为什么要使用控制器。当我只使用Post.java和PostRepository.java时,它似乎在我插入数据以及在我的“/ posts”路径中检索整个数据库时起作用。在文件中我有一个包含所有条目的posts数组。

Post.java

public class Post {

@Id private long id;

private String content;
private String time;
private String gender;  
private String age;


// Constructors

public Post() {

}

public Post(long id, String content, String time, String gender, String age) {
    this.id = id;
    this.content = content;
    this.time = time;
    this.gender = gender;
    this.age = age;
}

// Getters

public String getContent() {
    return content;
}

public long getId() {
    return id;
}

public String getTime() {
    return time;
}

public String getGender() {
    return gender;
}

public String getAge() {
    return age;
}

PostRepository.java

@RepositoryRestResource(collectionResourceRel = "posts", path = "posts")
public interface PostRepository extends MongoRepository<Post, String> {

List<Post> findPostByContent(@Param("content") String content);
}

PostController.java

@RestController
public class PostController {    

private final AtomicLong counter = new AtomicLong();

//Insert post in flow 
@RequestMapping(value="/posts", method = RequestMethod.POST)
public Post postInsert(@RequestBody Post post) {
    return new Post(counter.incrementAndGet(), post.getContent(), post.getTime(), post.getGender(), post.getAge());
}

//Get post in flow
@RequestMapping(value="/posts", method = RequestMethod.GET)
public Post getPosts() {
    return null;  //here I want to return all posts made using postInsert above.
}
}

当我使用我的控制器时,我可以发布数据,但它不会保存在json文件中,因此当我重新启动应用程序时,我再次从id:1开始。但是,如果没有控制器,则会保存数据。为什么会这样?我如何安排,以便控制器保存数据?我知道这可能是一个愚蠢的问题,但我不知道该怎么做。

1 个答案:

答案 0 :(得分:1)

控制器用于管理通过您的应用程序发出的请求。无论你使用@RestController还是@Controller都会产生完全不同的结果。

因此,REST方法是将对象视为资源。这里JSON是表示您要公开的资源的默认格式。

使用PostRepository,您必须在使用return语句公开数据之前在数据库中正确保存数据(例如,返回只显示JSON格式的资源(您的帖子)) 。 要保存帖子,您必须使用MongoRepository

的save()方法
    //Insert post in flow 
@RequestMapping(value="/posts", method = RequestMethod.POST)
public Post postInsert(@RequestBody Post post) {

// you have to use your repository to be able to CRUD operations in the store

final PostRepository postRepository;    

// save the post in the store

postRepository.save(new Post(counter.incrementAndGet(), post.getContent(), post.getTime(), post.getGender(), post.getAge()));

HttpHeaders httpHeaders = new HttpHeaders();
                    httpHeaders.setLocation(ServletUriComponentsBuilder
            .fromCurrentRequest().build().toUri());

return new ResponseEntity<>(null, httpHeaders, HttpStatus.CREATED);
}

ResponseEntity用于表示整个HTTP响应。您可以控制进入它的任何内容:状态代码,标题和正文。

要获取商店中的所有帖子,请使用存储库作为保存数据。

    //Get post in flow
@RequestMapping(value="/posts", method = RequestMethod.GET)
public Post getPosts() {
    return this.postRepository.findAll();
}