[SpringBoot2.7][GraphQL]カスタムscalar型を利用できるようにする

2023/03/04に公開

環境

  • 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の詳細については公式ドキュメントをご参照ください。
https://spring.pleiades.io/spring-graphql/docs/current/reference/html/#:~:text=てください。-,3.1.5. RuntimeWiringConfigurer,-RuntimeWiringConfigurer を使用

こうすることで、コンパイルエラーが解消されてDate型を利用可能になります!

Discussion