javascript
使用Spring Boot和MongoDB创建REST API
Spring Boot是一個自以為是的框架,可簡化Spring應用程序的開發。 它使我們擺脫了復雜配置文件的束縛,并幫助我們創建了不需要外部servlet容器的獨立Spring應用程序。
這聽起來實在令人難以置信,但Spring Boot確實可以完成所有這一切 。
這篇博客文章演示了實現REST API多么容易,該API為保存到MongoDB數據庫中的待辦事項提供CRUD操作。
讓我們開始創建我們的Maven項目。
注意:這篇博客文章假定您已經安裝了MongoDB數據庫。 如果尚未執行此操作,則可以按照博客文章中的說明進行操作: 使用MongoDB訪問數據 。
創建我們的Maven項目
我們可以按照以下步驟創建Maven項目:
- spring-boot-starter-web依賴關系提供了Web應用程序的依賴關系。
- spring-data-mongodb依賴項提供了與MongoDB文檔數據庫的集成。
pom.xml文件的相關部分如下所示:
<properties><!-- Enable Java 8 --><java.version>1.8</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><!-- Configure the main class of our Spring Boot application --><start-class>com.javaadvent.bootrest.TodoAppConfig</start-class> </properties><!-- Inherit defaults from Spring Boot --> <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.1.9.RELEASE</version> </parent><dependencies><!-- Get the dependencies of a web application --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Spring Data MongoDB--><dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-mongodb</artifactId></dependency> </dependencies><build><plugins><!-- Spring Boot Maven Support --><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins> </build>補充閱讀:
- Spring Boot參考手冊:9.1.1 Maven安裝
- Spring Boot參考手冊:12.1 Maven
- Spring Boot Maven插件–用法
讓我們繼續前進,了解如何配置應用程序。
配置我們的應用
我們可以按照以下步驟配置Spring Boot應用程序:
TodoAppConfig類的源代碼如下所示:
package com.javaadvent.bootrest;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration;@Configuration @EnableAutoConfiguration @ComponentScan public class TodoAppConfig {public static void main(String[] args) {SpringApplication.run(TodoAppConfig.class, args);} }現在,我們已經創建了配置類,用于配置和運行我們的Spring Boot應用程序。 由于從類路徑中找到了MongoDB jar,因此Spring Boot使用其默認設置來配置MongoDB連接。
補充閱讀:
- Spring Boot參考手冊:13.2定位主應用程序類
- Spring Boot參考手冊:14.配置類
- @EnableAutoConfiguration批注的Javadoc
- Spring Boot參考手冊:15.自動配置
- SpringApplication類的Javadoc
- Spring Boot參考手冊:27.2.1連接到MongoDB數據庫
讓我們繼續并實現我們的REST API。
實施我們的REST API
我們需要實現一個REST API,為待辦事項提供CRUD操作。 我們的REST API的要求是:
- 發送到URL'/ api / todo'的POST請求必須使用從請求正文中找到的信息來創建新的todo條目,并返回創建的todo條目的信息。
- 發送到網址“ / api / todo / {id}”的DELETE請求必須刪除從網址中找到ID的待辦事項,并返回已刪除的待辦事項的信息。
- 發送到URL'/ api / todo'的GET請求必須返回從數據庫中找到的所有todo條目。
- 發送到URL'/ api / todo / {id}'的GET請求必須返回其id從URL中找到的todo條目的信息。
- 發送到url'/ api / todo / {id}'的PUT請求必須使用從請求正文中找到的信息來更新現有待辦事項的信息,并返回更新后的待辦事項的信息。
我們可以通過執行以下步驟來滿足這些要求:
注意:此示例非常簡單,我們可以將存儲庫注入到控制器中。 但是,由于在實現實際應用程序時這不是可行的策略,因此我們將在Web層和存儲庫層之間添加一個服務層。
讓我們開始吧。
創建實體
我們需要創建包含單個待辦事項條目信息的實體類。 我們可以按照以下步驟進行操作:
Todo類的源代碼如下所示:
import org.springframework.data.annotation.Id;import static com.javaadvent.bootrest.util.PreCondition.isTrue; import static com.javaadvent.bootrest.util.PreCondition.notEmpty; import static com.javaadvent.bootrest.util.PreCondition.notNull;final class Todo {static final int MAX_LENGTH_DESCRIPTION = 500;static final int MAX_LENGTH_TITLE = 100;@Idprivate String id;private String description;private String title;public Todo() {}private Todo(Builder builder) {this.description = builder.description;this.title = builder.title;}static Builder getBuilder() {return new Builder();}//Other getters are omittedpublic void update(String title, String description) {checkTitleAndDescription(title, description);this.title = title;this.description = description;}/*** We don't have to use the builder pattern here because the constructed * class has only two String fields. However, I use the builder pattern * in this example because it makes the code a bit easier to read.*/static class Builder {private String description;private String title;private Builder() {}Builder description(String description) {this.description = description;return this;}Builder title(String title) {this.title = title;return this;}Todo build() {Todo build = new Todo(this);build.checkTitleAndDescription(build.getTitle(), build.getDescription());return build;}}private void checkTitleAndDescription(String title, String description) {notNull(title, "Title cannot be null");notEmpty(title, "Title cannot be empty");isTrue(title.length() <= MAX_LENGTH_TITLE,"Title cannot be longer than %d characters",MAX_LENGTH_TITLE);if (description != null) {isTrue(description.length() <= MAX_LENGTH_DESCRIPTION,"Description cannot be longer than %d characters",MAX_LENGTH_DESCRIPTION);}} }補充閱讀:
- 第2項:面對許多構造函數參數時,請考慮構造器
讓我們繼續并創建與MongoDB數據庫通信的存儲庫。
創建存儲庫
我們必須創建存儲庫接口,該接口用于將Todo對象保存到MondoDB數據庫并從中檢索Todo對象。
如果我們不想使用Java 8對Spring Data的支持,則可以通過創建擴展CrudRepository <T,ID>接口的接口來創建存儲庫。 但是,由于我們要使用Java 8支持,因此必須遵循以下步驟:
TodoRepository接口的源代碼如下所示:
import org.springframework.data.repository.Repository;import java.util.List; import java.util.Optional;interface TodoRepository extends Repository<Todo, String> {void delete(Todo deleted);List<Todo> findAll();Optional<Todo> findOne(String id);Todo save(Todo saved); }補充閱讀:
- CrudRepository <T,ID>接口的Javadoc
- Repository <T,ID>接口的Javadoc
- Spring Data MongoDB參考手冊:5.使用Spring Data存儲庫
- Spring Data MongoDB參考手冊:5.3.1對存儲庫定義進行微調
讓我們繼續并創建示例應用程序的服務層。
創建服務層
首先 ,我們必須創建一個服務接口,為待辦事項提供CRUD操作。 TodoService接口的源代碼如下所示:
import java.util.List;interface TodoService {TodoDTO create(TodoDTO todo);TodoDTO delete(String id);List<TodoDTO> findAll();TodoDTO findById(String id);TodoDTO update(TodoDTO todo); }TodoDTO類是DTO,其中包含單個todo條目的信息。 在創建示例應用程序的Web層時,我們將詳細討論它。
其次 ,我們必須實現TodoService接口。 我們可以按照以下步驟進行操作:
MongoDBTodoService的源代碼如下所示:
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service;import java.util.List; import java.util.Optional;import static java.util.stream.Collectors.toList;@Service final class MongoDBTodoService implements TodoService {private final TodoRepository repository;@AutowiredMongoDBTodoService(TodoRepository repository) {this.repository = repository;}@Overridepublic TodoDTO create(TodoDTO todo) {Todo persisted = Todo.getBuilder().title(todo.getTitle()).description(todo.getDescription()).build();persisted = repository.save(persisted);return convertToDTO(persisted);}@Overridepublic TodoDTO delete(String id) {Todo deleted = findTodoById(id);repository.delete(deleted);return convertToDTO(deleted);}@Overridepublic List findAll() {List todoEntries = repository.findAll();return convertToDTOs(todoEntries);}private List convertToDTOs(List models) {return models.stream().map(this::convertToDTO).collect(toList());}@Overridepublic TodoDTO findById(String id) {Todo found = findTodoById(id);return convertToDTO(found);}@Overridepublic TodoDTO update(TodoDTO todo) {Todo updated = findTodoById(todo.getId());updated.update(todo.getTitle(), todo.getDescription());updated = repository.save(updated);return convertToDTO(updated);}private Todo findTodoById(String id) {Optional result = repository.findOne(id);return result.orElseThrow(() -> new TodoNotFoundException(id));}private TodoDTO convertToDTO(Todo model) {TodoDTO dto = new TodoDTO();dto.setId(model.getId());dto.setTitle(model.getTitle());dto.setDescription(model.getDescription());return dto;} }現在,我們已經創建了示例應用程序的服務層。 讓我們繼續創建控制器類。
創建控制器類
首先 ,我們需要創建DTO類,其中包含單個待辦事項的信息,并指定用于確保僅將有效信息保存到數據庫的驗證規則。 TodoDTO類的源代碼如下所示:
import org.hibernate.validator.constraints.NotEmpty;import javax.validation.constraints.Size;public final class TodoDTO {private String id;@Size(max = Todo.MAX_LENGTH_DESCRIPTION)private String description;@NotEmpty@Size(max = Todo.MAX_LENGTH_TITLE)private String title;//Constructor, getters, and setters are omitted }補充閱讀:
- Hibernate Validator 5.0.3參考手冊
其次 ,我們必須創建控制器類來處理發送到我們的REST API的HTTP請求,并將正確的響應發送回客戶端。 我們可以按照以下步驟進行操作:
TodoController類的源代碼如下所示:
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestController;import javax.validation.Valid; import java.util.List;@RestController @RequestMapping("/api/todo") final class TodoController {private final TodoService service;@AutowiredTodoController(TodoService service) {this.service = service;}@RequestMapping(method = RequestMethod.POST)@ResponseStatus(HttpStatus.CREATED)TodoDTO create(@RequestBody @Valid TodoDTO todoEntry) {return service.create(todoEntry);}@RequestMapping(value = "{id}", method = RequestMethod.DELETE)TodoDTO delete(@PathVariable("id") String id) {return service.delete(id);}@RequestMapping(method = RequestMethod.GET)List<TodoDTO> findAll() {return service.findAll();}@RequestMapping(value = "{id}", method = RequestMethod.GET)TodoDTO findById(@PathVariable("id") String id) {return service.findById(id);}@RequestMapping(value = "{id}", method = RequestMethod.PUT)TodoDTO update(@RequestBody @Valid TodoDTO todoEntry) {return service.update(todoEntry);}@ExceptionHandler@ResponseStatus(HttpStatus.NOT_FOUND)public void handleTodoNotFound(TodoNotFoundException ex) {} }注意:如果驗證失敗,我們的REST API將驗證錯誤作為JSON返回,并將響應狀態設置為400。如果您想了解更多有關此信息,請閱讀標題為: Spring從Trenches:將驗證添加到REST API的博客文章。 。
這就對了。 現在,我們已經創建了一個REST API,它為待辦事項提供CRUD操作并將其保存到MongoDB數據庫中。 讓我們總結一下我們從此博客文章中學到的知識。
摘要
這篇博客文章教會了我們三件事:
- 我們可以通過僅聲明兩個依賴項來獲得Maven所需的依賴項: spring-boot-starter-web和spring-data-mongodb 。
- 如果我們對Spring Boot的默認配置感到滿意,則可以使用其自動配置支持并將新的jar“丟棄”到類路徑中來配置Web應用程序。
- 我們學習了如何創建一個簡單的REST API,該API將信息保存到MongoDB數據庫并從中查找信息。
您可以從Github獲得此博客文章的示例應用程序 。
翻譯自: https://www.javacodegeeks.com/2014/12/creating-a-rest-api-with-spring-boot-and-mongodb-2.html
總結
以上是生活随笔為你收集整理的使用Spring Boot和MongoDB创建REST API的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JBoss Data Virtualiz
- 下一篇: Spring MVC 4快速入门Mave