此版本仍在开发中,尚未被视为稳定版本。最新的稳定版本请使用 Spring GraphQL 1.3.1! |
此版本仍在开发中,尚未被视为稳定版本。最新的稳定版本请使用 Spring GraphQL 1.3.1! |
Spring Framework 6.0 引入了支持基础结构,用于将 Spring 应用程序编译为 GraalVM Native 映像。 如果您不熟悉GraalVM,它与JVM上部署的应用程序有何不同,以及它对Spring应用程序意味着什么。 请参阅专用的 Spring Boot 3.0 GraalVM Native Image 支持文档。 Spring Boot 还记录了 Spring 中 GraalVM 支持的已知限制。
GraphQL Java 元数据
由于应用程序的静态分析是在构建时完成的, 如果应用程序在运行时查找静态资源、执行反射或创建 JDK 代理,GraalVM 可能需要额外的提示。
GraphQL Java 在运行时执行 Native Images 敏感的三个任务:
-
加载用于消息国际化的资源包
-
关于架构检查内部类型的一些思考
-
对应用程序向架构注册的 Java 类型的反思。例如,当 GraphQL Java 从应用程序类型中获取属性时,就会发生这种情况
前两项是通过 Spring 团队贡献给 GraalVM 可访问性元数据存储库的可达性元数据进行处理的。 在构建依赖于 GraphQL Java 的应用程序时,本机编译工具会自动获取此元数据。 这不包括列表中的第三项,因为这些类型由应用程序本身提供,必须通过其他方法发现。
本机服务器应用程序支持
在典型的 Spring for GraphQL 应用程序中,绑定到 GraphQL 模式的 Java 类型在方法签名中公开
作为参数或返回类型。在构建的提前处理阶段,
Spring 或 GraphQL 将使用它来发现
相关类型并相应地注册可访问性元数据。
如果您正在构建具有 GraalVM 支持的 Spring Boot 应用程序,则这一切都会自动完成。@Controller
o.s.g.data.method.annotation.support.SchemaMappingBeanFactoryInitializationAotProcessor
如果应用程序“手动”注册数据获取器,则某些类型因此无法被发现。
然后,您应该将它们注册到 Spring Framework 的:@RegisterReflectionForBinding
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 | 通过这个,将暴露一个类型DataFetcher BookRepository Book |
3 | @RegisterReflectionForBinding 将注册类型和所有类型公开为字段的相关提示Book |
1 | 此应用程序声明“手动”添加一个RuntimeWiringConfigurer DataFetcher |
2 | 通过这个,将暴露一个类型DataFetcher BookRepository Book |
3 | @RegisterReflectionForBinding 将注册类型和所有类型公开为字段的相关提示Book |
客户支持
在应用程序上下文中不一定以 Bean 的形式存在,并且它不会在方法签名中公开模式中使用的 Java 类型。
因此,不能使用上一节中描述的策略。
对于客户端支持,Spring for GraphQL 为客户端基础架构嵌入了相关的可访问性元数据。
当涉及到应用程序使用的 Java 类型时,应用程序应该使用与“手动”数据获取器类似的策略,使用:GraphQlClient
AotProcessor
@RegisterReflectionForBinding
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 |