この記事では主に Spring Boot (3) を紹介し、使い慣れたコントローラーとサービスを取得します。必要な友達は参考にしてください。
使い慣れたコントローラーを取得する
Spring 開発に慣れている多くの学生にとって、コントローラー、サービス、DAO のルーチンが突然なくなると不快に感じるでしょう。実際、これらはまだ存在しますが、より単純なシナリオでは、これらはシステムが舞台裏で行うものになっています。このセクションでは、まずコントローラーを呼び戻す方法を見ていきます。折り返し電話するメリットは何ですか?まず、API URL のパスをカスタマイズできます。次に、パラメーターと返された json 構造に対して特定の処理を実行できます。
TodoController を TodoRepository と連動させたい場合は、もちろん TodoController で TodoRepository を参照する必要があります。
public class TodoController { @Autowired private TodoRepository repository; //省略其它部分 }
@Autowired この修飾子は依存関係の注入に使用されます。上記の使用法はフィールド注入と呼ばれ、クラスのメンバーに直接注入されます。しかし、Spring は現在、注入に constructor の使用を奨励しているので、コンストラクター注入メソッドを見てみましょう:
public class TodoController { private TodoRepository repository; @Autowired public TodoController(TodoRepository repository){ this.repository = repository; } //省略其它部分 }
もちろん、これが REST API をサポートするコントローラーであることを Spring に知らせるためには、依然として次のことを行う必要があります。 @ RestController としてマークします。デフォルトのパス マッピングではリソース ルートで複数形が使用され、英語の習慣に従って todo が子音の後に o で終わるため、todoes にマッピングされます。ただし、ここでは todo よりも todo を使用する方が快適なので、別の @RequestMapping("/todos") を使用してパスをカスタマイズします。このコントローラーの他のメソッドは比較的単純で、リポジトリ内のメソッドを使用して追加、削除、変更、確認するだけです。
package dev.local.todo; import org.bson.types.ObjectId; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.List; @RestController @RequestMapping("/todos") public class TodoController { private TodoRepository repository; @Autowired public TodoController(TodoRepository repository){ this.repository = repository; } @RequestMapping(method = RequestMethod.GET) public List<Todo> getAllTodos(@RequestHeader(value = "userId") String userId) { return repository.findByUserId(new ObjectId(userId)); } @RequestMapping(method = RequestMethod.POST) Todo addTodo(@RequestBody Todo addedTodo) { return repository.insert(addedTodo); } @RequestMapping(value = "/{id}", method = RequestMethod.GET) public Todo getTodo(@PathVariable String id) { return repository.findOne(id); } @RequestMapping(value = "/{id}", method = RequestMethod.PUT) Todo updateTodo(@PathVariable String id, @RequestBody Todo updatedTodo) { updatedTodo.setId(id); return repository.save(updatedTodo); } @RequestMapping(value = "/{id}", method = RequestMethod.DELETE) Todo removeTodo(@PathVariable String id) { Todo deletedTodo = repository.findOne(id); repository.delete(id); return deletedTodo; } }
上記のコードではさらにいくつかの点を説明する必要があります:
クラスで @RequestMapping("/todos") をマークした後、各メソッドに @RequestMapping を追加する必要があるのはなぜですか?クラスの上で定義された @RequestMapping のパラメーターは、デフォルトですべてのメソッドに適用されますが、メソッドに独自の特別な値が必要な場合は、このメソッドのマッピング パラメーターを定義する必要があります。たとえば、上記の addTodo の例では、パスも todos ですが、必要な Request メソッドは POST であるため、@RequestMapping(method = RequestMethod.POST) を指定しました。ただし、getTodo メソッドのパスは todos/:id である必要があります。このとき、 @RequestMapping(value = "/{id}", method = RequestMethod.GET) を指定する必要があります。これらのメソッドで受け入れられるパラメーターもさまざまなものを使用します。 @PathVariable はパラメータがパスから取得されることを示し、@RequestBody はパラメータが HTTP リクエストの本文から解析される必要があることを示します。同様に、@RequestHeader はパラメータが HTTP リクエストのヘッダーで定義されることを示します。
テストする前に、@Repository を使用して TodoRepository をマークし、Spring が
依存性注入中にこのクラスを見つけられるようにする必要もあります。
package dev.local.todo; import org.bson.types.ObjectId; import org.springframework.data.mongodb.repository.MongoRepository; import org.springframework.stereotype.Repository; import java.util.List; /** * Created by wangpeng on 2017/1/26. */ @Repository public interface TodoRepository extends MongoRepository<Todo, String>{ List<Todo> findByUserId(ObjectId userId); }
インターフェースを作成し、追加、削除、変更、確認の現在の操作を定義するのは簡単です:
public interface TodoService { Todo addTodo(Todo todo); Todo deleteTodo(String id); List<Todo> findAll(String userId); Todo findById(String id); Todo update(Todo todo); }
@Service public class MongoTodoServiceImpl implements TodoService{ private final TodoRepository repository; @Autowired MongoTodoServiceImpl(TodoRepository repository) { this.repository = repository; } @Override public Todo addTodo(Todo todo) { return repository.insert(todo); } @Override public Todo deleteTodo(String id) { Todo deletedTodo = repository.findOne(id); repository.delete(id); return deletedTodo; } @Override public List<Todo> findAll(String userId) { return repository.findByUserId(new ObjectId(userId)); } @Override public Todo findById(String id) { return repository.findOne(id); } @Override public Todo update(Todo todo) { repository.save(todo); return todo; } }
public class TodoController { private TodoService service; @Autowired public TodoController(TodoService service){ this.service = service; } @RequestMapping(method = RequestMethod.GET) public List<Todo> getAllTodos(@RequestHeader(value = "userId") String userId) { return service.findAll(userId); } @RequestMapping(method = RequestMethod.POST) Todo addTodo(@RequestBody Todo addedTodo) { return service.addTodo(addedTodo); } @RequestMapping(value = "/{id}", method = RequestMethod.GET) public Todo getTodo(@PathVariable String id) { return service.findById(id); } @RequestMapping(value = "/{id}", method = RequestMethod.PUT) Todo updateTodo(@PathVariable String id, @RequestBody Todo updatedTodo) { updatedTodo.setId(id); return service.update(updatedTodo); } @RequestMapping(value = "/{id}", method = RequestMethod.DELETE) Todo removeTodo(@PathVariable String id) { return service.deleteTodo(id); } }
Java無料ビデオチュートリアル
3. JAVAチュートリアルマニュアル
以上がTodoControllerでのTodoRepository参照の詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。