Spring Framework 6.0 引入了支持基础结构,用于将 Spring 应用程序编译为 GraalVM Native 映像。 如果您不熟悉GraalVM,它与JVM上部署的应用程序有何不同,以及它对Spring应用程序意味着什么。 请参阅专用的 Spring Boot 3.0 GraalVM Native Image 支持文档。 Spring Boot 还记录了 Spring 中 GraalVM 支持的已知限制Spring中文文档

GraphQL Java 元数据

由于应用程序的静态分析是在构建时完成的, 如果应用程序在运行时查找静态资源、执行反射或创建 JDK 代理,GraalVM 可能需要额外的提示。Spring中文文档

GraphQL Java 在运行时执行 Native Images 敏感的三个任务:Spring中文文档

  1. 加载用于消息国际化的资源包Spring中文文档

  2. 关于架构检查内部类型的一些思考Spring中文文档

  3. 对应用程序向架构注册的 Java 类型的反思。例如,当 GraphQL Java 从应用程序类型中获取属性时,就会发生这种情况Spring中文文档

前两项是通过 Spring 团队贡献给 GraalVM 可访问性元数据存储库的可达性元数据进行处理的。 在构建依赖于 GraphQL Java 的应用程序时,本机编译工具会自动获取此元数据。 这不包括列表中的第三项,因为这些类型由应用程序本身提供,必须通过其他方法发现。Spring中文文档

本机服务器应用程序支持

在典型的 Spring for GraphQL 应用程序中,绑定到 GraphQL 模式的 Java 类型在方法签名中公开 作为参数或返回类型。在构建的提前处理阶段, Spring 或 GraphQL 将使用它来发现 相关类型并相应地注册可访问性元数据。 如果您正在构建具有 GraalVM 支持的 Spring Boot 应用程序,则这一切都会自动完成。@Controllero.s.g.data.method.annotation.support.SchemaMappingBeanFactoryInitializationAotProcessorSpring中文文档

如果应用程序“手动”注册数据获取器,则某些类型因此无法被发现。 然后,您应该将它们注册到 Spring Framework 的:@RegisterReflectionForBindingSpring中文文档

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 此应用程序声明“手动”添加一个RuntimeWiringConfigurerDataFetcher
2 通过这个,将暴露一个类型DataFetcherBookRepositoryBook
3 @RegisterReflectionForBinding将注册类型和所有类型公开为字段的相关提示Book
1 此应用程序声明“手动”添加一个RuntimeWiringConfigurerDataFetcher
2 通过这个,将暴露一个类型DataFetcherBookRepositoryBook
3 @RegisterReflectionForBinding将注册类型和所有类型公开为字段的相关提示Book

客户支持

在应用程序上下文中不一定以 Bean 的形式存在,并且它不会在方法签名中公开模式中使用的 Java 类型。 因此,不能使用上一节中描述的策略。 对于客户端支持,Spring for GraphQL 为客户端基础架构嵌入了相关的可访问性元数据。 当涉及到应用程序使用的 Java 类型时,应用程序应该使用与“手动”数据获取器类似的策略,使用:GraphQlClientAotProcessor@RegisterReflectionForBindingSpring中文文档

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
1 在原生映像中,我们需要确保可以在运行时执行反射Project
2 @RegisterReflectionForBinding将注册类型和所有类型公开为字段的相关提示Project