【免费下载链接】howtographqlThe Fullstack Tutorial for GraphQL项目地址https://gitcode.com/gh_mirrors/ho/howtographql点击查看免费下载本指南以 howtographql 仓库中 Java 后端教程的开篇章节为核心系统讲解 GraphQL 服务器在 Java 生态中的定位、schema 驱动的开发范式以及 Java 静态类型系统与 GraphQL 类型系统的天然契合点。读完本篇你将理解 GraphQL 服务器的本质解析、校验、执行三层职责、schema-first 与 code-first 两种 Schema 构建路线的取舍并获得贯穿本教程后续章节查询、变更、认证、过滤、分页、实时订阅的完整学习路径。Java 生态中的 GraphQL为什么值得投入在主流编程语言的热度榜单中长期位居前列的 Java占据着大量企业级市场而这些场景恰好落在 GraphQL 的擅长区间之内。尤其值得关注的是两者在类型系统上的互补GraphQL 的强类型 Schema 与 Java 的静态类型体系在大多数情况下可以高度对齐类型定义、参数校验、返回结构都能在编译期获得一定程度的保障这让 Java 成为实现 GraphQL 后端非常自然的语言选择。需要先说明的是本仓库中的 Java 教程由社区作者撰写官方维护者已经明确指出该教程内容相对过时且其中使用了一些基于 graphql-java 的三方库如graphql-java-tools、graphql-java-servlet并未明确区分graphql-java 核心与周边工具库的边界。作者正在编写更新版本官方推荐的入门路径是 graphql-java 官网提供的 Spring Boot 集成教程。因此在跟随本教程学习时请将文中给出的库版本视为历史快照动手前务必到 Maven 中央仓库核对最新版本。什么是 GraphQL 服务器GraphQL 服务器是负责解析parse、校验validate、执行executeGraphQL 查询与变更的软件组件。这一点上它与数据库服务器高度类似数据库服务器解析并执行 SQLGraphQL 服务器则解析并执行 GraphQL 操作。关键区别在于GraphQL 服务器的实现在多种语言中都存在这意味着你可以把 GraphQL 几乎无痛地引入任何技术栈查询方客户端决定要获取哪些数据服务器只负责按 Schema 与解析器resolver交付结果传输层是开放的——GraphQL 服务器可以暴露在 HTTP 之上也可以通过 WebSocket 等任意传输协议承载并不强制绑定某一种。本章的目标就是带你从零开始用 Java 打造一个自定义的 GraphQL 后端逐步覆盖从 Schema 定义到查询、变更、认证、过滤、分页的完整能力。Schema 驱动的开发契约优先为何在 GraphQL 中变得自然契约优先contract-first的设计理念早已存在如 WSDL、Swagger但长期以来难以落地原因正如本教程开篇所指出的预先开发契约无论其形式是 WSDL、Swagger 还是其他往往要求你在最开始就对客户的数据需求有深刻而精确的理解而这种理解通常只能随着时间推移逐步建立。GraphQL 恰好消除了这一障碍获取什么数据由客户端全权决定这为 API 的平滑演进打开了通路。再加上 GraphQL 天然的自我描述能力通过 introspection 内省查询即可枚举全部类型与操作契约优先——在 GraphQL 术语中更准确地说是Schema 优先schema-first——就变得既自然又轻松。Schema客户端与服务器之间的中心契约在 GraphQL 中Schema 是客户端与服务器之间的中心契约它描述了服务器提供的所有数据类型针对这些类型可执行的所有操作查询 query 与变更 mutation字段的参数、类型、非空约束等元信息。Schema 优先的开发方式带来的收益不止于客户端与服务器解耦与易于 mock强制良好实践Schema 的字段天然分解为一个个小而简单的函数这恰好呼应了单一职责原则single responsibility principle而这些小函数可以顺理成章地充当 resolver演进友好字段按需添加、旧字段渐进淘汰客户端不受破坏性变更的困扰可验证Schema 本身就是文档introspection 让客户端工具如 GraphiQL可以实时探索并自动补全。动态生成 Schema 的替代路线教程同时预告了另一种值得探索的风格由于 Java 是静态类型语言类型信息已经蕴含在代码之中因此完全可以不手写 Schema 文本而是基于代码中的类型信息动态生成 Schema。这条路线称为 code-first代码优先它消除了 Schema 与 Java 模型之间的重复维护负担——这在教程第 11 章中会以 graphql-spqr 为例展开演示。两条 Schema 构建路线programmatic 与 SDL在正式动手前有必要先厘清 Schema 的两种构建方式它们将在后续章节中反复出现构建方式说明优缺点编程方式programmatic在代码中手工组装类型定义字段与其 resolver 紧邻放置但样板代码多Schema 定义语言SDL用文本化的、语言无关的 Schema 语言描述类型再动态绑定 resolver数据与行为清晰分离示例简洁本教程绝大部分章节采用SDL方式因为它允许用最简短的示例表达完整结构。一个典型的 SDL 定义如下对应教程第 1 章的schema.graphqlstype Link { url: String! description: String! } type Query { allLinks: [Link] } schema { query: Query }值得强调的一点是resolver 函数是字段定义的有机组成部分因此 Schema 不只是文档而是一个运行时对象实例在本教程中即 Java 对象。graphql-java-tools正是负责把 SDL 文本解析、与 Java resolver 类装配最终生成可执行的GraphQLSchema的桥梁。完整的 Java GraphQL 教程学习路径本教程共 13 个章节编号 0 至 12从零搭建一个 Hackernews 风格的 GraphQL 后端。以下是各章的核心脉络可作为按需查阅的索引第 1 章项目初始化与第一个 Schema使用 Maven 骨架maven-archetype-webapp生成 Web 项目groupId 为com.howtographql.sampleartifactId 为hackernews-graphql-java在src/main下新建java目录存放全部 Java 源码并删除src/main/webapp/WEB-INF否则 Servlet 3.x 风格的注解配置会被忽略依赖层面严格来说只有graphql-java是必需的但为了动态装配 resolver 还需要graphql-java-tools受 Apollo 的 graphql-tools 启发为通过 Web 暴露 API 则需要graphql-java-servlet与javax.servlet-api通过 Jetty Maven 插件jetty-maven-plugin在开发期启动服务mvn jetty:run即可运行在 8080 端口用WebServlet(urlPatterns /graphql)注解声明GraphQLEndpoint继承SimpleGraphQLServlet在构造器中用SchemaParser解析schema.graphqls并生成可执行 Schema。第 2 章查询解析器Queriesgraphql-java-tools 将类划分为两类数据类data classes是建模领域的简单 POJO解析器类resolvers建模查询与变更并承载 resolver 函数。以Link类型为例LinkPOJO 只含url、description两个不可变字段与 getterLinkRepository负责隔离存储细节初期为内存ArrayList后续切换为 MongoDBQuery implements GraphQLRootResolver中的allLinks()方法即查询 resolver返回linkRepository.getAllLinks()通过SchemaParser.newParser().file(schema.graphqls).resolvers(new Query(linkRepository))装配后访问http://localhost:8080/graphql?query{allLinks{url}}即可看到第一条查询结果。第 2 章还介绍了GraphiQL这一浏览器内 IDE将官方示例index.html中的graphiql.css与graphiql.js路径替换为 CDN 引用保存到src/main/webapp/index.html即可在http://localhost:8080/获得带自动补全、Schema 探索的调试环境。第 3 章变更Mutations变更与查询的语法结构相同区别仅在关键字与语义变更产生副作用。步骤为在 SDL 中新增type Mutation { createLink(url: String!, description: String!): Link }并将schema根改为同时声明query与mutation新建Mutation implements GraphQLRootResolver其中createLink(String url, String description)的参数名与类型须与 Schema 中定义的参数一一对应在buildSchema中通过.resolvers(new Query(linkRepository), new Mutation(linkRepository))注册。第 4 章连接外部存储Connectorsresolver 负责获取单个字段的值因此一次查询响应中的不同字段可以同时来自多个存储或第三方 API而客户端完全无感知——这正是 GraphQL 架构约束带来的好处。本章以 MongoDB 为例为Link增加id: ID!字段同步重构LinkPOJO新增id字段与双构造器在pom.xml引入mongodb-driver由于存储逻辑早已隔离在LinkRepository中引入 MongoDB 的影响面极小将内部ListLink替换为MongoCollectionDocument通过ObjectId与Document完成对象映射GraphQLEndpoint在静态初始化块中连接MongoClient().getDatabase(hackernews)并获取links集合。章节末尾还讨论了N1 查询问题若字段的 resolver 逐条回源数据库结果集会触发 N 次额外查询。解决策略包括 DataLoader 式批量加载以及graphql-java提供的BatchedExecutionStrategy配合Batched注解的批量DataFetcher。第 5 章认证AuthenticationGraphQL 规范本身不内置认证机制需要自行实现。本章演示邮箱-密码认证的完整链路Schema 新增createUser(name: String!, authProvider: AuthData!): User与input AuthData { email: String!, password: String! }以及User类型注意教程为保持简洁而明文存储密码生产环境必须哈希加盐对应新增User、AuthDataPOJO 与UserRepository按 email、按 id 查询保存用户登录变更signinUser(auth: AuthData): SigninPayload返回{ token, user }其中 token 示例仅为用户 id真实场景应使用 JWT 等标准方案密码不匹配时抛出GraphQLException(Invalid credentials)请求认证通过Authorization头完成创建AuthContext extends GraphQLContext持有当前用户并在GraphQLEndpoint中重写createContext从请求头剥离Bearer前缀后按 id 查找用户为Link增加postedBy: User关系字段配套新建LinkResolver implements GraphQLResolverLink非标量关系字段需要数据类 解析器类双类配合createLink通过DataFetchingEnvironment注入上下文取得当前用户 id。第 6 章更多变更——投票功能与自定义标量本章实现 Hackernews 的投票特性完整走一遍Schema → 数据类 → 解析器 → 仓库 → 注册的全流程新增createVote(linkId: ID, userId: ID): Vote与Vote类型含createdAt: DateTime!并声明scalar DateTimeVote使用ZonedDateTime建模时间VoteResolver负责user与link两个关系字段的解析自定义标量Scalars.dateTime通过GraphQLScalarType与Coercing接口实现serialize负责输出时格式化为 ISO 字符串parseLiteral负责输入时将字符串解析回ZonedDateTime最后在SchemaParser上通过.scalars(Scalars.dateTime)注册。第 7 章错误处理Error HandlingGraphQL 响应的结构是可预测的固定包含三个字段data操作结果errors执行过程中累积的全部错误extensions可选任意元数据。语法与校验错误由服务器自动处理而 resolver 中抛出的异常通常需要应用层定制处理策略isClientError决定错误消息是否原样发给客户端默认仅语法与校验错误透传其余以通用server error掩盖防止泄露堆栈细节重写filterGraphQLErrors可对错误做清洗、过滤、包装——教程演示了SanitizedError extends ExceptionWhileDataFetching配合 Jackson 的JsonIgnore隐藏内部异常同时把数据获取错误的精确消息透传给客户端更底层可通过自定义ExecutionStrategy并重写handleDataFetchingException控制Java 异常 → GraphQL 错误的翻译过程。第 8 章订阅SubscriptionsGraphQL 规范定义了名为subscriptions的实时推送机制但教程明确指出graphql-java当时仅能解析订阅请求尚未提供可用的端到端支持需要大量超出教程范围的手工工作。因此本章暂不展开实现作者承诺在生态成熟后更新——这是阅读时需要注意的现状边界。第 9 章过滤Filtering查询参数本身没有内置语义含义完全由实现者定义——这正是过滤功能得以轻松实现的原理。本章为allLinks增加filter: LinkFilter参数type Query { allLinks(filter: LinkFilter): [Link] } input LinkFilter { description_contains: String url_contains: String }配套要点LinkFilterPOJO 通过JsonProperty将 Java 风格的descriptionContains映射到 Schema 的下划线命名description_containsLinkRepository#getAllLinks接受可选过滤条件用 MongoDB 正则regex(description, .* pattern .*, i)实现大小写不敏感的子串匹配多个条件用and()组合Query#allLinks(LinkFilter filter)透传参数。第 10 章分页Pagination教程采用与 SQL 同源的limit-offset 分页type Query { allLinks(filter: LinkFilter, skip: Int 0, first: Int 0): [Link] }实现细节中有两个值得记忆的坑LinkRepository#getAllLinks用 MongoDB 的documents.skip(skip).limit(first)实现偏移与截取resolver 方法参数类型必须声明为Number因为graphql-java-tools会根据上下文有时塞入Integer、有时塞入BigInteger声明为具体类型会引发反序列化问题。注意limit-offset 分页与前端 Relay 的 cursor-based基于 connection 概念分页不兼容若前端使用 Relay 需改走 Connection 规范。第 11 章Schema 开发的替代路线Code-first这是开篇预告的落点。Schema-first 在 Java 中会导致明显的重复Link类型在 SDL 里定义一遍、在 POJO 里再写一遍改动需同步两处重构风险高而 code-first 直接从既有模型生成 Schema天然保持同步特别适合在存量代码库之上引入 GraphQL。教程以 graphql-spqr 为例pom.xml引入io.leangen.graphql:spqr并开启 javac 的-parameters编译参数以保留方法参数名用GraphQLQuery标注查询方法、GraphQLMutation标注变更方法、GraphQLArgument(name skip, defaultValue 0)定制参数名与默认值、GraphQLContext把外部方法接入类型、GraphQLRootContext直接注入AuthContext取代DataFetchingEnvironment通过new GraphQLSchemaGenerator().withOperationsFromSingletons(query, linkResolver, mutation).generate()一键生成 Schema类不再需要实现GraphQLRootResolver/GraphQLResolver也不再依赖graphql-java-tools业务代码几乎可以原样暴露为 GraphQL 操作。两种风格的取舍要点Schema-firstSchema 先行、清晰分离数据与行为、适合绿地项目但 Java 下重复度高Code-firstSchema 与模型同步、重构友好、适合存量代码库但 Schema 在服务器代码写出之前不存在客户端与服务器端工作存在先后依赖可先用桩代码生成 Schema 以解耦并行开发。学习建议与注意边界版本问题教程给出的库版本如graphql-java3.0.0、graphql-java-tools3.2.0、graphql-java-servlet4.0.0、javax.servlet-api3.0.1均为撰写时快照现已过时。动手前务必核对 Maven 最新版本并注意官方推荐以 graphql-java 的 Spring Boot 集成教程作为入门替代依赖边界本教程大量使用graphql-java-tools与graphql-java-servlet它们属于 graphql-java 生态的工具库而非核心实现理解这一点有助于你阅读后续版本迁移文档安全提醒教程中密码明文存储、token 直接用用户 id 都是教学简化真实项目必须使用密码哈希与 JWT 等标准方案可延伸主题教程总结章指出动态数据结构、恶意查询防护深度/复杂度限制、缓存策略等领域仍留待你自己探索。上述各章节对应的完整文档均位于仓库 content/backend/graphql-java/ 目录下按编号 0 至 12 顺序阅读即可获得从零到完整的可运行示例仓库的 写作规范 则解释了教程中Instruction操作块、代码注解等排版约定的设计意图有助于你理解每个章节的阅读节奏。赞分享【免费下载链接】howtographqlThe Fullstack Tutorial for GraphQL项目地址https://gitcode.com/gh_mirrors/ho/howtographql点击查看免费下载相关推荐5个核心优化策略让One-KVM视频流畅度提升300%的终极指南5个核心优化策略让One KVM视频流畅度提升300%的终极指南 One KVM Rust 是一个用 Rust 编写的轻量级 IP KVM 解决方案可通过网使用 graphql-code-generator 的 typescript-resolvers 插件构建类型安全的 GraphQL 服务端SDL-first 实战指南使用 graphql code generator 的 typescript resolvers 插件构建类型安全的 GraphQL 服务端SDL first开发工具基于 Schema-First 与代码生成构建类型安全的 GraphQL 服务器gqlgen 完整实战指南基于 Schema First 与代码生成构建类型安全的 GraphQL 服务器gqlgen 完整实战指南 gqlgen 是一个基于 Schema First后端GraphQL代码生成上一篇Spring Boot 3 JWT Security代码剖析深入理解AuthenticationService工作原理下一篇zlsZig语言的智能开发伴侣创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
OpenShift Origin 容器化部署与 Sample App 环境准备指南 测试云原生质量保障 【免费下载链接】origin Conformance test suite for OpenShift 项目地址: https://gitcode.com/gh_mirrors/or/origin 点击查看 免费下载 本文基于 origin 仓库中的 container-setup.md 展开,介绍如何以 Docker 容器方式拉起一个自… · 2026/9/25 3:01:10
LeetCode Top 100高频题刷题指南:吃透双指针、BFS与动态规划 还记得我第一次打开LeetCode的Top 100题单时,第一反应是:这些题真的够用吗?刷完到底要花多久?说实话,很多帖子喜欢把这份题单捧成“面试通关秘笈”,但我完整刷过两轮之后,更愿意把它看作一份高频… · 2026/9/25 3:01:10
QGIS数据处理-CityEngine程序化生成建筑 高德矢量
http://webrd01.is.autonavi.com/appmaptile?x{x}&y{y}&z{z}&langzh_cn&size1&scale1&style8
高德影像
https://webst01.is.autonavi.com/appmaptile?style6&x{x}&y{y}&z{z}
腾讯矢量
http://rt0.map.gtimg.com/realtimerender… · 2026/9/25 3:01:04
OpenShift Origin QuickStart 模板详解:应用骨架的构建原理、参数体系与自动同步机制 测试云原生质量保障 【免费下载链接】origin Conformance test suite for OpenShift 项目地址: https://gitcode.com/gh_mirrors/or/origin 点击查看 免费下载 本篇技术文章基于 examples/quickstarts/README.md 展开,系统讲解 OpenShift Origin 中 Qui… · 2026/9/25 3:57:03
React 360 资源缓存利器:深入解读 RefCountCache 引用计数缓存实现与应用 前端3D渲染 【免费下载链接】react-360 Create amazing 360 and VR content using React 项目地址: https://gitcode.com/gh_mirrors/re/react-360 点击查看 免费下载 导读
ref-count-cache 是 React 360 项目中的一个独立基础工具包,提供了一种以&quo… · 2026/9/25 3:56:57
免费给老 Mac 装上新版 macOS:OpenCore Legacy Patcher 三步完整走通 免费给老 Mac 装上新版 macOS:OpenCore Legacy Patcher 三步完整走通 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher
OpenCore Legacy Patcher&am… · 2026/9/25 3:56:57
TEN Framework 中的 PIL 演示 Python 扩展:基于 VideoFrame 的图像处理实战 人工智能AI Agent多模态语音AI 应用 【免费下载链接】ten-framework Open-source framework for conversational voice AI agents 项目地址: https://gitcode.com/TEN-framework/ten-framework 点击查看 免费下载 导读
本文围绕 pil_demo_python 扩展,… · 2026/9/25 3:56:57
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37