>Java >java지도 시간 >TodoController에서 TodoRepository를 참조하는 방법에 대한 자세한 설명

TodoController에서 TodoRepository를 참조하는 방법에 대한 자세한 설명

Y2J
Y2J원래의
2017-05-09 13:18:271210검색

이 글에서는 익숙한 컨트롤러와 서비스를 검색하기 위한 Spring Boot(3)를 주로 소개합니다. 필요한 친구는

익숙한 컨트롤러 검색은 어디에 있나요?

Spring 개발에 익숙한 많은 학생들은 Controller, Service, DAO의 루틴이 갑자기 사라지면 불편함을 느낄 것입니다. 실제로 이러한 기능은 여전히 ​​존재하지만 더 단순한 시나리오에서는 시스템이 뒤에서 사용자를 위해 수행하는 기능이 되었습니다. 이번 섹션에서는 먼저 Controller를 다시 소환하는 방법을 살펴보겠습니다. 다시 전화하면 어떤 이점이 있나요? 먼저 API URL의 경로를 사용자 정의할 수 있고, 두 번째로 매개변수와 반환된 json 구조에 대해 특정 처리를 수행할 수 있습니다.

TodoController가 TodoRepository와 함께 작동하도록 하려면 물론 TodoController에서 TodoRepository를 참조해야 합니다.

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

@Autowired 이 수정자는 종속성 주입에 사용됩니다. 위의 사용법을 필드 주입이라고 하며 클래스 멤버를 직접 주입합니다. 하지만 이제 Spring에서는 주입을 위해 생성자를 사용하도록 권장하므로 생성자의 주입 방법을 살펴보겠습니다.

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

물론 Spring에게 이것이 REST API 컨트롤러인 경우에도 @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 요청의 헤더에 정의된다는 것을 나타냅니다. HTTP 요청.
테스트하기 전에 Spring이 종속성 주입 중에 이 클래스를 찾을 수 있도록 @Repository를 사용하여 TodoRepository를 표시해야 합니다.

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

을 사용하여 테스트할 수 있습니다.

테스트

어디가 있나요? 컨트롤러 서비스? 어디?

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

MySQL과 같은 잠재적인 "확장성"을 사용하여 이 인터페이스의 구현 이름을 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 무료 동영상 튜토리얼

Geek Academy Java 동영상 튜토리얼

3. JAVA 튜토리얼 매뉴얼

위 내용은 TodoController에서 TodoRepository를 참조하는 방법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.