利用Spring?Boot和JPA創(chuàng)建GraphQL?API
前言:
GraphQL既是API查詢(xún)語(yǔ)言,也是使用當(dāng)前數(shù)據(jù)執(zhí)行這些查詢(xún)的運(yùn)行時(shí)。GraphQL讓客戶(hù)能夠準(zhǔn)確地要求他們所需要的東西,僅此而已,使API隨著時(shí)間的推移更容易發(fā)展,并通過(guò)提供API中數(shù)據(jù)的清晰易懂的描述,支持強(qiáng)大的開(kāi)發(fā)工具。
在本文中,我們將創(chuàng)建一個(gè)簡(jiǎn)單的機(jī)場(chǎng)位置應(yīng)用程序。
一、生成項(xiàng)目
去https://start.spring.io/
并生成一個(gè)項(xiàng)目,不要忘記添加Spring Web、H2數(shù)據(jù)庫(kù)和Spring DATA JPA依賴(lài)項(xiàng)。
1. 添加依賴(lài)項(xiàng)
要啟用GraphQL
的使用,請(qǐng)?jiān)谙旅嫣砑舆@兩個(gè)依賴(lài)項(xiàng)。
<dependency> <groupId>com.<a rel="external nofollow" target="_blank" >graphql</a>-java</groupId> <artifactId>graphql-spring-boot-starter</artifactId> <version>5.0.2</version> </dependency> <dependency> <groupId>com.graphql-java</groupId> <artifactId>graphql-java-tools</artifactId> <version>5.2.4</version> </dependency>
二、Schema
GraphQL模式定義了通過(guò)API可用的數(shù)據(jù)點(diǎn)。模式描述了數(shù)據(jù)類(lèi)型及其關(guān)系,以及可用的操作,例如檢索數(shù)據(jù)的查詢(xún)和創(chuàng)建、更新和刪除數(shù)據(jù)的突變。
在resources文件夾中,創(chuàng)建一個(gè)擴(kuò)展名為“.graphqls”的文件,全名為“location.graphqls
”。
//Define the Entity attribute type Location { id: ID! name: String! address: String! } type Query { findAllLocations: [Location]! } type Mutation { newLocation(name: String!, address: String) : Location! deleteLocation(id:ID!) : Boolean updateLocationName(newName: String!, id:ID!) : Location! }
“!
”表示該字段為必填字段。
三、Entity 和 Repository
現(xiàn)在創(chuàng)建一個(gè)名為Location
的實(shí)體。該位置應(yīng)該有三個(gè)屬性:id
、name
和address
,如模式中所述。當(dāng)然,也會(huì)產(chǎn)生 Getters, Setters, 和 Constrictors。
然后,在本例中,存儲(chǔ)庫(kù)只使用CrudRepository,并擴(kuò)展位置實(shí)體。
//imports... public interface LocationRepository extends CrudRepository<Location, Long> { }
四、Queries & Exceptions
1. 查詢(xún)
查詢(xún)?cè)试S我們檢索數(shù)據(jù)。每個(gè)查詢(xún)可以有一個(gè)特定的對(duì)象,它完全基于查詢(xún)中指定的字段返回,您可以添加或刪除字段以匹配您需要的確切數(shù)據(jù),以適合您的特定用例。
創(chuàng)建一個(gè)解析器包,然后添加一個(gè)實(shí)現(xiàn)GraphQLQueryResolver
的新查詢(xún)類(lèi),并添加@Component
注釋。我們只需要添加之前在location中輸入的location.graphqls
。
//imports... @Component public class Query implements GraphQLQueryResolver { private LocationRepository locationRepository; public Query(LocationRepository locationRepository) { this.locationRepository = locationRepository; } public Iterable<Location> findAllLocations() { return locationRepository.findAll(); } }
2. Mutator
GraphQL中的Mutator允許它更新存儲(chǔ)在服務(wù)器上的數(shù)據(jù)。與查詢(xún)不同,創(chuàng)建、更新或刪除等Mutator會(huì)改變數(shù)據(jù)。
現(xiàn)在創(chuàng)建一個(gè)mutator包,然后添加一個(gè)實(shí)現(xiàn)GraphQLMutationResolver
和添加@Component
注釋的新類(lèi)Mutation
。另外,添加我們之前輸入的location.graphqls
。
//imports... @Component public class Mutation implements GraphQLMutationResolver { private LocationRepository locationRepository; public Mutation(LocationRepository locationRepository) { this.locationRepository = locationRepository; } public Location newLocation(String name, String address) { Location location = new Location(name, address); locationRepository.save(location); return location; } public boolean deleteLocation(Long id) { locationRepository.deleteById(id); return true; } public Location updateLocationName(String newName, Long id) { Optional<Location> optionalLocation = locationRepository.findById(id); if(optionalLocation.isPresent()) { Location location = optionalLocation.get(); location.setName(newName); locationRepository.save(location); return location; } else { throw new LocationNotFoundException("Location Not Found", id); } }
3. Exceptions
創(chuàng)建一個(gè)異常包,然后添加一個(gè)新的類(lèi)LocationNotFoundException
,該類(lèi)擴(kuò)展RuntimeException
并實(shí)現(xiàn)GraphQLError
。
//imports... public class LocationNotFoundException extends RuntimeException implements GraphQLError { private Map<String, Object> extensions = new HashMap<>(); public LocationNotFoundException(String message, Long invalidLocationId) { super(message); extensions.put("invalidLocationId", invalidLocationId); } @Override public List<SourceLocation> getLocations() { return null; } @Override public Map<String, Object> getExtensions() { return extensions; } @Override public ErrorType getErrorType() { return ErrorType.DataFetchingException; }
現(xiàn)在GraphQL API已經(jīng)可以使用了!
到此這篇關(guān)于利用Spring Boot和JPA創(chuàng)建GraphQL API的文章就介紹到這了,更多相關(guān)創(chuàng)建GraphQL API內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
IntelliJ IDEA 中g(shù)it的使用圖文教程
本文通過(guò)圖文并茂的形式給大家介紹了IntelliJ IDEA 中g(shù)it的使用,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2018-02-02使用Feign消費(fèi)服務(wù)時(shí)POST/GET請(qǐng)求方式詳解
這篇文章主要介紹了使用Feign消費(fèi)服務(wù)時(shí)POST/GET請(qǐng)求方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06解決IDEA 2020.1版本 maven Test命令出現(xiàn)導(dǎo)包錯(cuò)誤的問(wèn)題
這篇文章主要介紹了IDEA 2020.1版本 maven Test命令出現(xiàn)導(dǎo)包錯(cuò)誤的問(wèn)題及解決方法,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08Java中的靜態(tài)內(nèi)部類(lèi)詳解及代碼示例
這篇文章主要介紹了Java中的靜態(tài)內(nèi)部類(lèi)詳解及代碼示例,具有一定參考價(jià)值,需要的朋友可以了解下。2017-10-10