当我想在我的数据库中发布内容并检索它时,我需要帮助了解我应该如何以及为什么要使用控制器。当我只使用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开始。但是,如果没有控制器,则会保存数据。为什么会这样?我如何安排,以便控制器保存数据?我知道这可能是一个愚蠢的问题,但我不知道该怎么做。
答案 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();
}