Heim  >  Artikel  >  Java  >  Ausführliche Erläuterung der Referenzierung von TodoRepository in TodoController

Ausführliche Erläuterung der Referenzierung von TodoRepository in TodoController

Y2J
Y2JOriginal
2017-05-09 13:18:271163Durchsuche

In diesem Artikel wird hauptsächlich Spring Boot (3) vorgestellt, um den bekannten Controller und Service abzurufen.

Wo ist der Service Controller?

Viele Studenten, die an die Frühjahrsentwicklung gewöhnt sind, werden sich unwohl fühlen, wenn die Routinen von Controller, Service und DAO plötzlich weg sind. Tatsächlich existieren diese Dinge immer noch, aber in einfacheren Szenarien sind sie zu Dingen geworden, die das System hinter den Kulissen für Sie erledigt. In diesem Abschnitt schauen wir uns zunächst an, wie man den Controller zurückbeschwört. Welche Vorteile hat ein Rückruf? Erstens können wir den Pfad der API-URL anpassen und zweitens können wir bestimmte Verarbeitungen an den Parametern und der zurückgegebenen json-Struktur durchführen.

Wenn wir möchten, dass TodoController mit TodoRepository zusammenarbeitet, müssen wir natürlich auf TodoRepository in TodoController verweisen.

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

@Autowired Dieser Modifikator wird für die Abhängigkeitsinjektion verwendet. Die obige Verwendung wird als Feldinjektion bezeichnet, die Klassenmitglieder direkt injiziert. Aber Spring empfiehlt jetzt die Verwendung von Konstruktor für die Injektion. Schauen wir uns also die Konstruktor-Injektionsmethode an:

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

Natürlich, um Spring wissen zu lassen, dass dies ein ist Der von REST unterstützte API-Controller muss weiterhin als @RestController markiert werden. Da bei der Standardpfadzuordnung die Pluralform am Ressourcenstamm verwendet wird und todo nach dem Konsonanten mit o endet, wird es nach englischem Brauch auf todoes abgebildet. Da es hier jedoch komfortabler ist, Todos als Todos zu verwenden, verwenden wir ein anderes @RequestMapping("/todos"), um den Pfad anzupassen. Die anderen Methoden in diesem Controller sind relativ einfach. Verwenden Sie einfach die Methoden im Repository zum Hinzufügen, Löschen, Ändern und Überprüfen.

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

Ein paar weitere Punkte müssen im obigen Code erklärt werden:

Warum wird @RequestMapping("/todos") nach jedem in der Klasse markiert? Methode? Muss ich noch @RequestMapping hinzufügen? Die über der Klasse definierten Parameter von @RequestMapping werden standardmäßig auf alle Methoden angewendet. Wenn wir jedoch feststellen, dass eine Methode einen eigenen speziellen Wert benötigt, müssen wir die Zuordnungsparameter dieser Methode definieren. Im obigen Beispiel, addTodo, ist der Pfad beispielsweise ebenfalls todos, aber die Request-Methode ist POST, also geben wir @RequestMapping(method = RequestMethod.POST) an. Aber der Pfad der getTodo-Methode sollte todos/:id sein. Zu diesem Zeitpunkt müssen wir @RequestMapping(value = "/{id}", method = RequestMethod.GET)
Die von diesen Methoden akzeptierten Parameter angeben Verwenden Sie verschiedene Modifikationssymbole. @PathVariable gibt an, dass die Parameter aus dem Pfad abgerufen werden, während @RequestBody angibt, dass die Parameter aus dem Hauptteil der HTTP-Anfrage analysiert werden sollen, und ähnlich wie @RequestHeader angibt, dass die Parameter im Header der definiert sind HTTP-Anfrage.
Bevor wir testen können, müssen wir auch @Repository verwenden, um TodoRepository zu markieren, damit Spring diese Klasse während der Abhängigkeitsinjektion finden kann.

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

Als nächstes können Sie PostMan

verwenden, um einen Test durchzuführen:

Test it

Controller Service Wolltuch? Wo?

Kinder, die mit Spring vertraut sind, werden sich auf jeden Fall fragen: Was wir gerade getan haben, entspricht dem direkten Zugriff des Controllers auf die Daten, und die Isolation reicht nicht aus. Tatsächlich denke ich, dass diese Art von einfachem Design oft recht gut ist, weil das Unternehmen dieses Stadium noch nicht erreicht hat und ein übermäßig kompliziertes Design eigentlich nicht viel Sinn macht. Aber hier werden wir es Schritt für Schritt üben, um das gewohnte Gefühl wiederzuerlangen.

Es ist einfach, zum ursprünglichen vertrauten Modus zurückzukehren. Erstellen Sie eine neue TodoService-Schnittstelle und definieren Sie die aktuellen Vorgänge zum Hinzufügen, Löschen, Ändern und Überprüfen:

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

Zur Vorbeugung werden wir in Zukunft MySQL und andere potenzielle „Skalierbarkeit“ verwenden. Wir nennen die Implementierung dieser Schnittstelle MongoTodoServiceImpl und nehmen dann einfach den größten Teil des Codes im Controller und ändern ihn. Damit das System diese Abhängigkeit finden und in die erforderliche Klasse einfügen kann, markieren wir sie natürlich als @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;
 }
}

Schließlich ändern wir alle Methoden im Controller mithilfe von Service und in einfache Aufrufe Du bist fertig.

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

Um ehrlich zu sein, wenn jede einfache Klasse so geschrieben ist, werde ich stark von der Absicht von Spring Boot abweichen, obwohl Sie 1000 Gründe dafür nennen können. Ebenso ist DAO oder DTO sehr einfach zu schreiben, aber ich empfehle dennoch, den Komfort zu genießen, den Spring Boot uns bietet, bis das Geschäft nicht mehr kompliziert ist.

【Verwandte Empfehlungen】

1. Kostenloses Java-Video-Tutorial

2. Geek Academy Java-Video-Tutorial

3. JAVA-Tutorial-Handbuch

Das obige ist der detaillierte Inhalt vonAusführliche Erläuterung der Referenzierung von TodoRepository in TodoController. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn