java - GraphQL,如何返回byte[]类型

标签 java spring-boot graphql

我将缩略图作为字节数组保存在数据库中。我似乎无法弄清楚如何通过 GraphQL 将这些返回给前端客户端。

在标准 REST 方法中,我只需发送一个带有字节的 POJO,然后我就可以轻松地将其渲染出来。

但是尝试返回 byte[] 会抛出

Unable to match type definition (ListType{type=NonNullType{type=TypeName{name='Byte'}}}) with java type (class java.lang.Byte): Java class is not a List or generic type information was lost: class java.lang.Byte

该错误是描述性的,告诉我出了什么问题,但我不知道如何解决。

我的thumbnail.graphqls看起来像:

type Thumbnail {
    id: ID!
    resource: [Byte!]
}

还有缩略图 POJO

public class Thumbnail extends BaseEntity {
    byte[] resource;
}

我在Java端使用graphql-spring-boot-starter来处理事情,我认为它支持开箱即用的Byte,所以我在哪里出错了?

对 GraphQL 非常陌生,因此这可能是一个明显的错误。

干杯,

最佳答案

您必须将其序列化为标准类型之一。 如果您希望字节数组看起来像“F3269AB2”这样的字符串,或者像[1,2,3,4,5]这样的整数数组,这完全取决于您。

您可以通过为实体编写解析器来实现序列化,如下所示:

public class ThumbnailResolver extends GraphQLResolver<Thumbnail> {
        public String resource(Thumbnail th) { ... }
        //or List<Integer> resource(Thumbnail th) { ... }
        //or whatever
    }

解析器始终优先于您的实体。这意味着如果在解析器类中找到具有正确名称、参数和返回类型的解析器方法,则将调用该方法而不是实体方法。这样我们就可以“重写”实体方法,以便返回其他结果,甚至是与实际实体字段不同的类型。通过使用解析器,我们还可以访问实体通常没有的应用程序范围的服务等。

编写解析器后,不要忘记将架构文件更新为:

resource: String
#or resource:[Int]
#or whatever

您的模式应该引用解析器类型,因为这是 graphQL 接收的类型。实际的实体类型将变得与 graphQL 无关。

作为 B 计划,您可以实现一个新的标量。这就像发明一种新的基本类型。这也并不难。您可以看到已经存在的标量类型 here并做类似的事情。

然后,您可以将新类型命名为 ByteArray 或类似名称,并在架构中声明它:

scalar ByteArray

然后使用它。

我会选择第一个解决方案,因为它更容易、更快地实现。

关于java - GraphQL,如何返回byte[]类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52786666/

相关文章:

java - Android Phonegap fatal error

gradle - 使用Gradle和Spring Boot时无法发布到本地Maven存储库

postgresql - 我应该在 PostgreSQL 还是服务器后端过滤数据?

graphql - GraphQL 查询分析仅指查询吗?

amazon-web-services - 如何导出 AWS AppSync 解析器?

java - Android 应用许可致命异常 : Service Intent must be explicit

java - 如何使用 MyBatis 调用返回 BOOLEAN 的函数?

java - 碰撞检测 : What side was hit? [Java、Slick2D]

java - 如何在 Spring Boot 中使用 yaml 文件从 jar 访问文本文件?

java - Spring Boot CRUD 应用程序 - Bean 未找到错误