GraphQL SPQR和Spring Boot入門 | baeldung
GraphQL Schema Publisher & Query Resolver,簡稱 SPQR,是從帶註釋的 Java 類中生成 GraphQL 模式。
在傳統的方法中,如果我們想把GraphQL新增到我們的專案中,我們將不得不遵循兩個步驟:
- 首先,我們必須在專案中新增GraphQL schema資料結構檔案。
- 其次,我們需要編寫各自的Java POJO,代表模式中的每個型別。
這意味著我們要在兩個地方維護相同的資訊:在模式檔案和Java類中。這種方法很容易出錯,而且需要花費更多精力來維護專案。
SPQR試圖解決這種不匹配mismatch現象:
設定
在Maven中加入:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>io.leangen.graphql</groupId> <artifactId>spqr</artifactId> <version>0.11.2</version> </dependency> |
模型類:
public class Book { private Integer id; private String author; private String title; } |
正如我們在上面看到的,它不包括任何SPQR註釋。如果我們不擁有原始碼,但想從這個庫中獲益,這可能非常有用。
服務:
@Service public class BookService implements IBookService { Set<Book> books = new HashSet<>(); public Book getBookWithTitle(String title) { return books.stream() .filter(book -> book.getTitle() .equals(title)) .findFirst() .orElse(null); } public List<Book> getAllBooks() { return books.stream() .collect(Collectors.toList()); } public Book addBook(Book book) { books.add(book); return book; } public Book updateBook(Book book) { books.remove(book); books.add(book); return book; } public boolean deleteBook(Book book) { return books.remove(book); } } |
用graphql-spqr公開服務
剩下的事情就是建立一個解析器,它將暴露GraphQL的改變和查詢。為了做到這一點,我們將使用兩個重要的SPQR註解--@GraphQLMutation和@GraphQLQuery。
@Service public class BookResolver { @Autowired IBookService bookService; @GraphQLQuery(name = "getBookWithTitle") public Book getBookWithTitle(@GraphQLArgument(name = "title") String title) { return bookService.getBookWithTitle(title); } @GraphQLQuery(name = "getAllBooks", description = "Get all books") public List<Book> getAllBooks() { return bookService.getAllBooks(); } @GraphQLMutation(name = "addBook") public Book addBook(@GraphQLArgument(name = "newBook") Book book) { return bookService.addBook(book); } @GraphQLMutation(name = "updateBook") public Book updateBook(@GraphQLArgument(name = "modifiedBook") Book book) { return bookService.updateBook(book); } @GraphQLMutation(name = "deleteBook") public void deleteBook(@GraphQLArgument(name = "book") Book book) { bookService.deleteBook(book); } } |
控制器
最後,我們將定義一個Spring @RestController。為了用SPQR暴露服務,我們將配置GraphQLSchema和GraphQL物件。
@RestController public class GraphqlController { private final GraphQL graphQL; @Autowired public GraphqlController(BookResolver bookResolver) { GraphQLSchema schema = new GraphQLSchemaGenerator() .withBasePackages("com.baeldung") .withOperationsFromSingleton(bookResolver) .generate(); this.graphQL = new GraphQL.Builder(schema) .build(); } |
值得注意的是,我們必須將我們的BookResolver註冊為一個單例 。
在我們使用SPQR的過程中,最後一項任務是建立一個/graphql端點。它將作為與我們的服務的單一聯絡點,並將執行所要求的查詢和變化。
@PostMapping(value = "/graphql") public Map<String, Object> execute(@RequestBody Map<String, String> request, HttpServletRequest raw) throws GraphQLException { ExecutionResult result = graphQL.execute(request.get("query")); return result.getData(); } } |
測試
我們可以通過檢查/graphql端點來檢查結果。例如,讓我們通過執行以下cURL命令來檢索所有的圖書記錄。
curl -g \ -X POST \ -H "Content-Type: application/json" \ -d '{"query":"{getAllBooks {id author title }}"}' \ http://localhost:8080/graphql |
使用GraphQL SPQR Spring Boot啟動器
從事SPQR工作的團隊已經建立了一個Spring Boot啟動器,這使得使用它更加容易。讓我們來看看吧
<dependency> <groupId>io.leangen.graphql</groupId> <artifactId>graphql-spqr-spring-boot-starter</artifactId> <version>0.0.6</version> </dependency> |
@Service @GraphQLApi public class BookService implements IBookService { Set<Book> books = new HashSet<>(); @GraphQLQuery(name = "getBookWithTitle") public Book getBookWithTitle(@GraphQLArgument(name = "title") String title) { return books.stream() .filter(book -> book.getTitle() .equals(title)) .findFirst() .orElse(null); } @GraphQLQuery(name = "getAllBooks", description = "Get all books") public List<com.baeldung.sprq.Book> getAllBooks() { return books.stream() .toList(); } @GraphQLMutation(name = "addBook") public Book addBook(@GraphQLArgument(name = "newBook") Book book) { books.add(book); return book; } @GraphQLMutation(name = "updateBook") public Book updateBook(@GraphQLArgument(name = "modifiedBook") Book book) { books.remove(book); books.add(book); return book; } @GraphQLMutation(name = "deleteBook") public boolean deleteBook(@GraphQLArgument(name = "book") Book book) { return books.remove(book); } } |
我們不需要GraphqlController類:/graphql端點將被自動新增。
相關文章
- Spring Boot GraphQL 實戰 01_快速入門Spring Boot
- Spring Boot 2和JPA入門Spring Boot
- 開始使用GraphQL Java和Spring BootJavaSpring Boot
- Spring Boot面試問題| BaeldungSpring Boot面試
- Spring Boot入門Spring Boot
- Spring Boot Reactor Netty配置 | BaeldungSpring BootReactNetty
- GraphQL入門
- Spring Boot Dubbo 入門Spring Boot
- spring boot快速入門Spring Boot
- Spring Boot HttpExchange 入門Spring BootHTTP
- Spring Boot系列(一):Spring Boot 入門篇Spring Boot
- Spring boot入門(二):Spring boot整合MySql,Mybatis和PageHelper外掛Spring BootMySqlMyBatis
- GraphQL 快速入門【5】GraphQL 示例
- Spring Boot入門(一):搭建Spring Boot專案Spring Boot
- 基於Spring Batch的Spring Boot的教程 - BaeldungBATSpring Boot
- Spring Boot (一)快速入門Spring Boot
- Spring Boot 2.0.1 入門教程Spring Boot
- Spring Boot的Kafka入門Spring BootKafka
- Spring Boot(一):入門篇Spring Boot
- 使用Spring Boot排程WebSocket推送的教程和原始碼 - BaeldungSpring BootWeb原始碼
- Spring boot入門(一):快速搭建Spring boot專案Spring Boot
- Spring Boot和Netflix DGS的GraphQL原始碼案例Spring Boot原始碼
- 使用Spring Boot實現的GraphQL示例Spring Boot
- Spring Boot整合hessian入門Spring Boot
- Spring Boot 中使用 thrift 入門Spring Boot
- 在Spring Boot設定Swagger 2 - BaeldungSpring BootSwagger
- 加快Spring Boot啟動的幾種方法 | baeldungSpring Boot
- GraphQL 入門簡介
- React+GraphQL入門React
- Spring Boot 2 (十):Spring Boot 中的響應式程式設計和 WebFlux 入門Spring Boot程式設計WebUX
- 使用Spring Boot和GraphQL構建靈活的API服務Spring BootAPI
- Spring Boot 整合 Spring Security 入門案例教程Spring Boot
- Spring Boot + GraphQL建立API的開源案例Spring BootAPI
- Spring Boot的Clean架構教程與原始碼 - BaeldungSpring Boot架構原始碼
- spring-boot入門程式詳解Springboot
- Spring Boot 中使用 grpc 入門Spring BootRPC
- 【CuteJavaScript】GraphQL真香入門教程JavaScript
- Spring Boot GraphQL 實戰 03_分頁、全域性異常處理和非同步載入Spring Boot非同步