この記事では主に 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); }次に、PostMan を使用してテストを行うことができます: Test itController Service?どこ? Spring に慣れている子供たちは間違いなく、今私たちがやったことはコントローラーがデータに直接アクセスするのと同等であり、分離が十分ではないことを尋ねるでしょう。実際、多くの場合、この種のシンプルなデザインが非常に優れていると思います。なぜなら、ビジネスはまだその段階に達しておらず、過度に複雑なデザインは実際にはあまり意味がないからです。しかし、ここでは、慣れ親しんだ感覚を取り戻すために、段階的に練習していきます。 新しい TodoService
インターフェースを作成し、追加、削除、変更、確認の現在の操作を定義するのは簡単です:
public interface TodoService { Todo addTodo(Todo todo); Todo deleteTodo(String id); List<Todo> findAll(String userId); Todo findById(String id); Todo update(Todo todo); }future では、このインターフェイスの実装に MongoTodoServiceImpl という名前を付け、コントローラー内のコードの大部分を取得して変更します。もちろん、システムがこの依存関係を見つけて必要なクラスに注入できるように、 @Service としてマークします
@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; } }最後に、Controller 内のすべてのメソッドを Service を使用した単純な呼び出しに変更すれば完了です。
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); } }正直に言うと、すべての単純なクラスがこのように記述されている場合、そうする理由は 1000 個挙げることができますが、Spring Boot の意図から大きく逸脱してしまいます。同様に、DAO または DTO は非常に簡単に作成できますが、ビジネスが複雑にならなくなるまでは Spring Boot がもたらす利便性を楽しむことをお勧めします。 【関連おすすめ】1.
Java無料ビデオチュートリアル
3. JAVAチュートリアルマニュアル
以上がTodoControllerでのTodoRepository参照の詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。