Maison  >  Article  >  Java  >  Explication détaillée du référencement de TodoRepository dans TodoController

Explication détaillée du référencement de TodoRepository dans TodoController

Y2J
Y2Joriginal
2017-05-09 13:18:271167parcourir

Cet article présente principalement Spring Boot (3) pour récupérer le contrôleur et le service familiers. Les amis dans le besoin peuvent se référer à

Récupérer le contrôleur familier Où est le contrôleur de service ?

Pour de nombreux étudiants habitués au développement Spring, ils se sentiront mal à l'aise si les routines du contrôleur, du service et du DAO disparaissent soudainement. En fait, ces choses existent toujours, mais dans des scénarios plus simples, elles sont devenues des choses que le système fait pour vous en coulisses. Dans cette section, nous verrons d’abord comment rappeler le contrôleur. Quels sont les avantages de rappeler ? Premièrement, nous pouvons personnaliser le chemin de l'URL API, et deuxièmement, nous pouvons effectuer certains traitements sur les paramètres et la structure json renvoyée.

Si nous voulons que TodoController fonctionne avec TodoRepository, nous devons bien sûr référencer TodoRepository dans TodoController.

public class TodoController {
 @Autowired
 private TodoRepository repository;
 //省略其它部分
}

@Autowired Ce modificateur est utilisé pour l'injection de dépendances. L'utilisation ci-dessus est appelée injection de champ, qui injecte directement les membres de la classe. Mais Spring encourage désormais l'utilisation du constructeur pour l'injection, jetons donc un coup d'œil à la méthode d'injection du constructeur :

public class TodoController {
 private TodoRepository repository;
 @Autowired
 public TodoController(TodoRepository repository){
  this.repository = repository;
 }
 //省略其它部分
}

Bien sûr, afin de faire savoir à Spring qu'il s'agit d'un Le contrôleur API pris en charge par REST doit toujours être marqué comme @RestController. Étant donné que le mappage de chemin par défaut utilisera la forme plurielle à la racine de la ressource et que todo se termine par o après la consonne, selon la coutume anglaise, il sera mappé sur todoes. Mais il est plus confortable d'utiliser des todos que des todoes ici, nous utilisons donc un autre @RequestMapping("/todos") pour personnaliser le chemin. Les autres méthodes de ce contrôleur sont relativement simples, utilisez simplement les méthodes du référentiel pour ajouter, supprimer, modifier et vérifier.

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;
 }
}

Quelques points supplémentaires doivent être expliqués dans le code ci-dessus :

Pourquoi @RequestMapping("/todos") est-il marqué sur la classe après chaque méthode ? Dois-je toujours ajouter @RequestMapping ? Les paramètres de @RequestMapping définis au-dessus de la classe seront appliqués à toutes les méthodes par défaut, mais si nous constatons qu'une méthode a besoin de sa propre valeur spéciale, nous devons définir les paramètres de mappage de cette méthode. Par exemple, dans l'exemple ci-dessus, addTodo, le chemin est également todos, mais la méthode Request est POST, nous donnons donc @RequestMapping(method = RequestMethod.POST). Mais le chemin de la méthode getTodo doit être todos/:id À ce stade, nous devons donner à @RequestMapping(value = "/{id}", method = RequestMethod.GET)
Les paramètres acceptés par ces méthodes également. utiliser divers symboles de modifications, @PathVariable indique que les paramètres sont obtenus à partir du chemin, tandis que @RequestBody indique que les paramètres doivent être analysés à partir du corps de la requête HTTP, et similaire @RequestHeader indique que les paramètres sont définis dans l'en-tête du Demande HTTP.
Avant de pouvoir tester, nous devons également utiliser @Repository pour marquer TodoRepository afin que Spring puisse trouver cette classe lors de l'injection de dépendances.

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);
}

Ensuite, vous pouvez utiliser PostMan

pour faire un test :

Testez-le

Contrôleur Service Drap de laine ? Où?

Les enfants qui connaissent Spring se demanderont certainement, ce que nous venons de faire équivaut à ce que le contrôleur accède directement aux données, et l'isolement n'est pas suffisant. En fait, je pense que souvent, ce type de conception simple est plutôt bon, car l'entreprise n'a pas encore atteint ce stade et une conception trop compliquée n'a en fait pas beaucoup de sens. Mais ici, nous allons le pratiquer étape par étape pour retrouver le sentiment familier.

Il est facile de revenir au mode familier d'origine. Créez une nouvelle interface TodoService et définissez les opérations actuelles d'ajout, de suppression, de modification et de vérification :

public interface TodoService {
 Todo addTodo(Todo todo);
 Todo deleteTodo(String id);
 List<Todo> findAll(String userId);
 Todo findById(String id);
 Todo update(Todo todo);
}

Pour la prévention, nous utiliserons MySQL et d'autres "évolutivités" potentielles à l'avenir. Nous nommons l'implémentation de cette interface MongoTodoServiceImpl, puis prenons simplement la majeure partie du code dans le contrôleur et le modifions. Bien sûr, pour que le système trouve cette dépendance et l'injecte dans la classe requise, nous la marquons comme @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;
 }
}

Enfin, remplacez toutes les méthodes du Controller par de simples appels utilisant Service et tu as fini.

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);
 }
}

Pour être honnête, si chaque cours simple est écrit comme ceci, je m'écarterai profondément de l'intention de Spring Boot, même si vous pouvez citer 1000 raisons de le faire. De même, DAO ou DTO sont très simples à écrire, mais je recommande quand même de profiter de la commodité que Spring Boot nous apporte jusqu'à ce que les affaires ne soient pas compliquées.

【Recommandations associées】

1. Tutoriel vidéo Java gratuit

2. Tutoriel vidéo Java de la Geek Academy

.

3. Manuel du didacticiel JAVA

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn