⛳
[SpringBoot2.7][GraphQL]カスタムscalar型を利用できるようにする
環境
- Java -> 11
- SpringBoot -> 2.7.8
- org.springframework.boot:spring-boot-starter-graphql -> 2.7.8
- gradle
build.gradle
plugins {
id 'java'
id 'org.springframework.boot' version '2.7.8'
id 'io.spring.dependency-management' version '1.0.15.RELEASE'
}
group = 'com.course'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.3.0'
compileOnly 'org.projectlombok:lombok'
runtimeOnly 'com.h2database:h2'
annotationProcessor 'org.projectlombok:lombok'
// graphql
implementation 'org.springframework.boot:spring-boot-starter-graphql'
}
tasks.named('test') {
useJUnitPlatform()
}
スキーマ定義
graphql-schema.graphqls
scalar Date
# クエリ定義
type Query {
fetchEmployeeById(employeeId: ID): EmployeeResponse
}
# タイプ定義
type EmployeeResponse {
employeeId: ID!
employeeName: String!
personal: Personal
}
type Personal {
employeeId: ID!
birthday: Date!
telephoneNumber: String!
mailAddress: String!
}
こちらのスキーマ定義でコンパイルをすると、コンパイルエラーが発生しました。
エラー内容
Caused by: graphql.schema.idl.errors.SchemaProblem: errors=[There is no scalar implementation for the named 'Date' scalar type]
Date型はGraphQLの標準scalar型に含まれておらず、定義されていないというエラーです。
GraphQLの標準scalar型
GraphQLには標準のscalar型が5つ存在します。
scalar型 | 説明 |
---|---|
Int | 符号付き32ビット整数 |
Float | 32ビット長の浮動小数点数 |
String | 文字列 |
Boolean | 真偽値 |
ID | ユニークな識別子を表す文字列 |
これら以外のscalar型を使う場合は、設定を追加して利用可能に必要があります。
カスタムscalar型を利用できるようにする
まずは拡張scalarを定義するため、build.gradleに以下を追加してライブラリをインストールします。
build.gradle
dependencies {
// graphql
implementation 'com.graphql-java:graphql-java-extended-scalars:20.0'
}
ライブラリをインストールしたあとに、下記のような設定クラスを新規作成します。
ScalarConfig.java
import graphql.scalars.ExtendedScalars;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.graphql.execution.RuntimeWiringConfigurer;
@Configuration
public class ScalarConfig {
@Bean
public RuntimeWiringConfigurer runtimeWiringConfigurer() {
return wiringBuilder -> wiringBuilder.scalar(ExtendedScalars.Date);
}
}
RuntimeWiringConfigurerの詳細については公式ドキュメントをご参照ください。
こうすることで、コンパイルエラーが解消されてDate型を利用可能になります!
Discussion