关于是不是使用基于 Annotation 的 spring boot graphql server 的指导

Posted

技术标签:

【中文标题】关于是不是使用基于 Annotation 的 spring boot graphql server 的指导【英文标题】:guidance on whether to use Annotation based spring boot graphql server关于是否使用基于 Annotation 的 spring boot graphql server 的指导 【发布时间】:2020-04-02 00:37:01 【问题描述】:

我正在使用 spring boot 和 graphql 开发一个新项目。我对如何进行感到困惑,因为有两种开发方法,一种是通过 graphqls 文件和基于注释的方法。我更喜欢基于注释的方法,但它们是否稳定。示例:https://github.com/leangen/graphql-spqr。

【问题讨论】:

【参考方案1】:

我第二个AllirionX's answer,只是想添加一些细节。

首先,回答您的问题:是的,SPQR 已经相当稳定一段时间了。许多团队在生产中成功地使用了它。它仍在 0.X 版本中的唯一原因是缺少文档,但 API 中偶尔会发生小的重大变化。

其次,我还想补充一点,代码优先并不意味着您也不能合约优先。事实上,我认为你仍然应该以这种风格发展。唯一的区别是您可以将合同编写为 Java 接口,而不是一种新语言。

正如我在SPQR's README 中强调的那样:

请注意,以代码优先的方式进行开发仍然有效 架构优先,不同之处在于您开发的架构不在 另一种语言,但在 Java 中,使用您的 IDE、编译器和所有 你的工具帮助你。对架构的重大更改意味着 编译会失败。无需 linter 或其他脆弱的 hack。

因此,API(如接口所描述的)是否随着其他代码的变化而变化完全取决于您。如果您出于任何原因需要 SDL,则始终可以从可执行模式或自省结果生成它。

【讨论】:

【参考方案2】:

我认为“如何进行”这个问题没有好坏之分。 有两种不同的方法来构建您的 graphql 服务器(使用 graphl-java、graphql-java-tools、graphql-spqr),每种方法都有其优点和不便之处。所有这些库都提出了一个 springboot 启动器。请注意,我从未使用过 graphql-spqr。

架构优先(使用 graphql-java 或 graphql-java-tools)

在这种方法中,您首先创建一个 SDL 文件。 graphql 库将解析它,而“所有”您要做的就是将每个 graphql 类型连接到它的数据获取器。 graphql-java-tools 甚至可以为您完成接线。

优势

无需详述如何在服务器端构建 Graphql 架构 您有一个不错的 graphql 架构文件,可供客户端读取和使用,从而轻松构建 graphql 客户端 您实际上首先定义了您的 api(SDL 架构):更改 api 的实现不需要任何更改客户端

不方便

没有编译时检查。如果某些东西没有正确连接,则会在运行时引发异常。但这可以通过使用 graphql-java-codegen 来消除,它将为您的 graphql 类型、联合、查询、枚举等生成 java 类和接口。 如果使用graphql-java(没有自动连接),我觉得我不得不编写冗长无聊的数据获取器。所以我切换到了 graphql-java-tools。

代码优先(使用 graphql-java 或 grapqhl-java-tools 或 graphql-spqr)

graphql 模式是以编程方式构建的(通过使用 graphql-spqr 进行注释或通过在 graphql-java 中构建 GraphQLSchema 对象)

优势

编译时检查 无需同时维护 SDL 和 Domain 类

不方便

由于您的架构是从您的代码库生成的,因此更改您的代码库将更改 api,这对于依赖它的客户端来说可能不是很好。

这是我对这些不同框架的看法,我很高兴被证明我错了。最终决定取决于您的项目:大小、是否有现有代码库等。

【讨论】:

关于 Schema First 方法:您可以使用graphql-java-codegen 根据您的模式生成类。这意味着可以对架构进行编译时检查

以上是关于关于是不是使用基于 Annotation 的 spring boot graphql server 的指导的主要内容,如果未能解决你的问题,请参考以下文章

注解_Annotation

关于annotation的认识

关于Spring事务<tx:annotation-driven/>的理解(Controller可以使用@Transactional)

深入理解Spring的ImportSelector接口

关于Spring中的<context:annotation-config/>配置

关于反射与自定义注解的一些使用