利用Spring?Boot和JPA創(chuàng)建GraphQL?API
前言:
GraphQL既是API查詢語(yǔ)言,也是使用當(dāng)前數(shù)據(jù)執(zhí)行這些查詢的運(yùn)行時(shí)。GraphQL讓客戶能夠準(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依賴項(xiàng)。

1. 添加依賴項(xiàng)
要啟用GraphQL的使用,請(qǐng)?jiān)谙旅嫣砑舆@兩個(gè)依賴項(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ù)類型及其關(guān)系,以及可用的操作,例如檢索數(shù)據(jù)的查詢和創(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. 查詢
查詢?cè)试S我們檢索數(shù)據(jù)。每個(gè)查詢可以有一個(gè)特定的對(duì)象,它完全基于查詢中指定的字段返回,您可以添加或刪除字段以匹配您需要的確切數(shù)據(jù),以適合您的特定用例。
創(chuàng)建一個(gè)解析器包,然后添加一個(gè)實(shí)現(xiàn)GraphQLQueryResolver的新查詢類,并添加@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ù)。與查詢不同,創(chuàng)建、更新或刪除等Mutator會(huì)改變數(shù)據(jù)。
現(xiàn)在創(chuàng)建一個(gè)mutator包,然后添加一個(gè)實(shí)現(xiàn)GraphQLMutationResolver和添加@Component注釋的新類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è)新的類LocationNotFoundException,該類擴(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)文章
Springboot應(yīng)用中過(guò)濾器如何修改response的header和body內(nèi)容
這篇文章主要介紹了Springboot應(yīng)用中過(guò)濾器如何修改response的header和body內(nèi)容問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07
基于@Valid和@Validated驗(yàn)證List集合的踩坑記錄
這篇文章主要介紹了基于@Valid和@Validated驗(yàn)證List集合的踩坑記錄,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07
淺談Android開(kāi)發(fā)中項(xiàng)目的文件結(jié)構(gòu)及規(guī)范化部署建議
這篇文章主要介紹了Android開(kāi)發(fā)中項(xiàng)目的文件結(jié)構(gòu)及規(guī)范化部署建議,組織好代碼文件的結(jié)構(gòu)有利于維護(hù)團(tuán)隊(duì)合作的效率,需要的朋友可以參考下2016-03-03
Mybatis-Plus批量添加或修改數(shù)據(jù)的3種方式總結(jié)
使用Mybatis-plus可以很方便的實(shí)現(xiàn)批量新增和批量修改,不僅比自己寫foreach遍歷方便很多,而且性能也更加優(yōu)秀,下面這篇文章主要給大家介紹了關(guān)于Mybatis-Plus批量添加或修改數(shù)據(jù)的3種方式,需要的朋友可以參考下2023-05-05
基于javaWeb 項(xiàng)目SSM配置要點(diǎn)及可能遇到的問(wèn)題和解決方法
下面小編就為大家?guī)?lái)一篇基于javaWeb 項(xiàng)目SSM配置要點(diǎn)及可能遇到的問(wèn)題和解決方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10
JDK9為何要將String的底層實(shí)現(xiàn)由char[]改成了byte[]
String 類的源碼已經(jīng)由?char[]?優(yōu)化為了?byte[]?來(lái)存儲(chǔ)字符串內(nèi)容,為什么要這樣做呢?本文就詳細(xì)的介紹一下,感興趣的可以了解一下2022-03-03
SpringBoot如何實(shí)現(xiàn)分離資源文件并打包
這篇文章主要介紹了SpringBoot如何實(shí)現(xiàn)分離資源文件并打包,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06

