对于最新的稳定版本,请使用Spring GraphQL 2.0.2spring-doc.cadn.net.cn

GraalVM Native 支持

Spring Framework 6.0 引入了将 Spring 应用程序编译为 GraalVM 原生镜像 的支持基础设施。 如果您对 GraalVM 不太熟悉,或者想知道它与部署在 JVM 上的应用程序有何不同,以及这对 Spring 应用程序意味着什么,请参阅专门的 Spring Boot 3.0 GraalVM 原生镜像支持文档。 Spring Boot 还记录了 关于 Spring 中使用 GraalVM 的已知限制spring-doc.cadn.net.cn

GraphQL Java 元数据

由于您的应用程序的静态分析在构建时进行, 如果您的应用程序在运行时查找静态资源、执行反射或创建JDK代理, GraalVM 可能需要额外的提示。spring-doc.cadn.net.cn

GraphQL Java 在运行时执行三项任务,Native Image 会对此敏感:spring-doc.cadn.net.cn

  1. 加载资源包以进行消息国际化spring-doc.cadn.net.cn

  2. 关于内部类型的一些思考用于模式检查spring-doc.cadn.net.cn

  3. 反射您应用程序注册到模式中的Java类型。例如,当GraphQL Java从应用类型中获取属性时就会发生这种情况。spring-doc.cadn.net.cn

第一部分和第二部分内容是通过 Spring 团队贡献给 GraalVM 达到性元数据仓库的达达到性元数据来处理的。 此元数据在构建依赖于 GraphQL Java 的应用程序时由原生编译工具自动获取。 这并不涵盖列表中的第三项内容,因为这些类型是由应用程序本身提供的,并且必须通过其他方式被发现。spring-doc.cadn.net.cn

原生服务器应用程序支持

在典型的Spring for GraphQL应用中,与GraphQL模式绑定的Java类型通常会在@Controller方法签名中以参数或返回值的形式暴露。 在构建过程中的提前编译处理阶段,Spring或GraphQL会使用其o.s.g.data.method.annotation.support.SchemaMappingBeanFactoryInitializationAotProcessor 来发现相关类型并相应地注册可达性元数据。 如果你正在使用GraalVM支持的Spring Boot应用进行构建,这一切都会自动完成。spring-doc.cadn.net.cn

如果您的应用程序是“手动”注册数据获取器,某些类型将无法被自动发现。 您应该使用Spring框架的1来手动进行注册:spring-doc.cadn.net.cn

import graphql.schema.DataFetcher;

import org.springframework.aot.hint.annotation.RegisterReflectionForBinding;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.graphql.data.query.QuerydslDataFetcher;
import org.springframework.graphql.execution.RuntimeWiringConfigurer;

@Configuration
@RegisterReflectionForBinding(Book.class) (3)
public class GraphQlConfiguration {

	@Bean
	RuntimeWiringConfigurer customWiringConfigurer(BookRepository bookRepository) { (1)
		DataFetcher<Book> dataFetcher = QuerydslDataFetcher.builder(bookRepository).single();
		return (wiringBuilder) -> wiringBuilder
				.type("Query", (builder) -> builder.dataFetcher("book", dataFetcher)); (2)
	}

}
1 此应用声明了一个RuntimeWiringConfigurer,手动添加一个DataFetcher
2 通过这个DataFetcherBookRepository将暴露一种Book类型
3 @RegisterReflectionForBinding 将注册与 Book 类型以及所有作为字段暴露的类型相关的提示

客户端支持

The GraphQlClient不一定存在于应用上下文中作为bean,并且它不暴露在模式中的Java类型的方法签名中。 上述部分中描述的AotProcessor策略不能用作结果。 为了客户端支持,Spring for GraphQL嵌入了相关的可达性元数据以供客户端基础设施使用。 对于应用程序使用的Java类型,应用应该采用与“手动”数据获取器类似的方法,使用@RegisterReflectionForBindingspring-doc.cadn.net.cn

import reactor.core.publisher.Mono;

import org.springframework.aot.hint.annotation.RegisterReflectionForBinding;
import org.springframework.graphql.client.GraphQlClient;
import org.springframework.stereotype.Component;

@Component
@RegisterReflectionForBinding(Project.class) (2)
public class ProjectService {

	private final GraphQlClient graphQlClient;

	public ProjectService(GraphQlClient graphQlClient) {
		this.graphQlClient = graphQlClient;
	}

	public Mono<Project> project(String projectSlug) {
		String document = """
				query projectWithReleases($projectSlug: ID!) {
					project(slug: $projectSlug) {
						name
						releases {
							version
						}
					}
				}
				""";

		return this.graphQlClient.document(document)
				.variable("projectSlug", projectSlug)
				.retrieve("project")
				.toEntity(Project.class); (1)
	}
}
1 在原生镜像中,我们需要确保可以在运行时对 Project 执行反射操作。
2 @RegisterReflectionForBinding 将注册与 Project 类型以及所有作为字段暴露的类型相关的提示