2016-04-18 11 views
0

私のDBに何かを投稿して取得したいとき、どうやってコントローラを使うべきかを理解する助けが必要です。 Post.javaとPostRepository.javaのみを使用すると、データを挿入したり、データベース全体を "/ posts"のパスに取り込んだりするとうまくいくようです。ファイル内には、すべてのエントリを含むposts配列があります。場合MongoDB POSTとGETレコードを持つSpringコントローラ

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

コントローラは、あなたのアプリケーションからのリクエストを管理するためのものです。 @RestControllerと@Controllerのどちらを使うかによって、全く異なる結果が得られます。

したがって、RESTのアプローチは、オブジェクトをリソースとして認識することです。 JSONは、公開するリソースを表すデフォルトの形式です。あなたがreturn文でそれらを暴露する前に、適切ストア内のデータを保存する必要があなたのPostRepositoryを使用して

、(例えばリターンだけでJSON形式 でリソース(あなたのポスト)を表示。 あなたが使用する必要がポストを保存するにはMongoRepository

//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(); 
} 
+0

よろしくお願いいたします。しかし、このガイドのコードに従うと、 https://spring.io/guides/gs/accessing-mongodb-data-rest/ これらのコードは、私がアクセスしたときにレコードが保存される必要はありません。 url。なぜ私はこのコードを指定する必要があるのか​​理解していないだけです。彼らはコントローラを持っていないし、要求はまだ適切に管理されています。愚かな質問をして申し訳ありません、そしてこれに答える時間を取ってくれてありがとう。 – BananaBackend

+0

あなたが指しているガイドでは、データはすでに作成されているものとみなされます。投稿のリクエストでは、ちょうどカールでテストが行​​われました。いずれもデータベースに保持されません。適切に処理された要求は、データがストアに保存されることを意味するものではありません。 –

+0

答えが正しいかどうかを確認するには、上部に押してください。 –

関連する問題