GraphQL,如何返回字节类型[]

时间:2018-10-12 20:34:58

标签: java spring-boot graphql

我的缩略图以字节数组的形式保存在数据库中。我似乎无法锻炼如何通过GraphQL将这些返回给前端客户端。

在标准的REST方法中,我只是将字节发送回POJO,我可以轻松地将其渲染出来。

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

  

无法将类型定义(ListType {type = NonNullType {type = TypeName {name ='Byte'}}}})与Java类型(类java.lang.Byte)匹配:Java类不是列表或泛型类型信息丢失了:类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非常新鲜,因此这可能是一个明显的错误。

干杯

1 个答案:

答案 0 :(得分:0)

您必须将其序列化为标准类型之一。 如果您希望字节数组看起来像一个字符串,例如“ 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,您可以实施一个新的Scalar。这就像发明新的基本类型。这也不难。您可以看到已经存在的标量类型here,并执行类似的操作。

然后您可以命名新的类型ByteArray或类似的名称,在您的模式中声明它:

scalar ByteArray

然后使用它。

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